«Привет, Siri. Включи обогреватели» — Интеграция умного дома на базе NooLite с Apple HomeKit

    image

    В своей первой статье я описал предысторию появления системы удаленного управления отоплением в загородном доме через Telegram-бота, которым я и моя семья пользовались долгое время.


    С выходом iOS 10, Apple представила пользователям приложение Дом — свою реализацию интерфейса управления умным домом через HomeKit. Меня весьма заинтересовала данная тема и, потратив несколько вечеров на изучение доступного материала, я решил реализовать интеграцию данного продукта с моей системой. В статье я подробно изложу процесс ее установки и настройки, а также поделюсь видео с результатами того, что получилось в итоге.


    Содержание


    1. Введение
    2. Установка и настройка OpenHab
    3. Подключение NooLite к OpenHab
    4. Установка и настройка HomeKit для OpenHab
    5. Настройка приложения Дом
    6. Результат
    7. Заключение


    Введение


    Для понимания исходных данных и начальной конфигурации умного дома, советую ознакомится с первой статьей.

    Первой задачей был поиск готовых свободных решений в автоматизации домашнего оборудования с поддержкой HomeKit. Тут я сразу вспомнил несколько статей об open source продукте OpenHab. Почитав документацию и немного погуглив, действительно нашел аддон поддержки протокола HomeKit. На данный момент готовится к выходу вторая версия OpenHab и проводится активное бета тестирование. Последней доступной версией на тот момент была beta4, которую и решил использовать.


    Процесс интеграции можно разделить на 4 этапа:


    1. Установка и настройка OpenHab
    2. Подключение NooLite к OpenHab
    3. Установка и настройка HomeKit для OpenHab
    4. Настройка приложения "Дом"

    В итоге должна была получится следующая схема:
    image





    Установка и настройка OpenHab


    У OpenHab 2 есть довольно подробная документация, где помимо основных платформ есть и туториал по установке на Raspberry Pi. Не буду копировать сюда все шаги, так как никаких проблем с установкой не возникло.


    После установки web-интерфейс OpenHab был доступен в браузере по адресу: http://<адрес_устройства_с_openhab>:8080.


    image


    Сразу были доступны:


    1. Basic UI, Classic UI — панели управления устройствами подключенными к OpenHab
    2. Rest API — собственно rest API
    3. Paper UI — интерфейс администирования OpenHab, через который его можно настроить

    Пока Basic UI был пустой:


    image





    Подключение NooLite к OpenHab


    Исходя из документации, для подключения нового устройства к OpenHab нужно было:


    1. Добавить его в items
    2. Добавить в sitemap, чтобы оно отображалось в OpenHab панели управления умным домом (Basic UI, Classic UI). Данный шаг можно пропустить, к работе с HomeKit он не относится, но с его помощью можно проверить, что OpenHab видит NooLite и правильно с ним работает.
    3. Добавить правила в rules, если нужна автоматизация или дополнительная логика обработки событий

    Items


    В items мы описываем конечные управляемые устройства, к примеру силовой блок NooLite и "учим" OpenHab работать с ним:


    itemtype itemname ["labeltext"] [<iconname>] [(group1, group2, ...)] [{bindingconfig}]

    где:


    • itemtype — тип устройства (Switch, Dimmer и т.д.)
    • itemname — имя устройства
    • labeltext — текстовое отображение. К примеру для датчика: "Температура [%.1f °C]", для блока просто "Обогреватели"
    • iconname — отображаемая иконка
    • group1 — группы
    • bindingconfig — то, как управлять этим устройством

    Самое интересное здесь — это биндинг. То, каким образом будет осуществляться взаимодействие с управляемым устройством. Немного поискав информацию по работе OpenHab с NooLite, нашел готовый вариант. Но он был написан для работы с NooLite USB адаптерами PC и RX серий. В моей же системе управление силовыми блоками работало через ethernet-шлюз PR1132, поэтому нужно было искать другие варианты работы.


    Посмотрев на доступные биндинги, нашел универсальные Http binding и Exec binding, с помощью которых можно было реализовать общение с NooLite:


    1. Http binding позволяет выполнять сетевой запрос при возникновении какого-либо события (включение/выключение, получение информации с датчика). Используя API в PR1132, можно было реализовать прямое общение OpenHab с NooLite.
    2. Exec binding — на событие выполняется какая-либо команда.

    На тот момент я думал, что будет необходима дополнительная логика пре/пост обработки запросов к NooLite, поэтому выбрал второй вариант.


    NooLite CLI


    При разработке Telegram-бота, предыдущей реализации интерфейса общения с умным домом, я уже написал простенький класс-обертку над API вызовами к NooLite:


    noolite_api.py
    """
    NooLite API wrapper
    """
    
    import requests
    from requests.auth import HTTPBasicAuth
    from requests.exceptions import ConnectTimeout, ConnectionError
    import xml.etree.ElementTree as ET
    
    class NooLiteSens:
        """Класс хранения и обработки информации, полученной с датчиков
    
        Пока как таковой обработки нет
        """
        def __init__(self, temperature, humidity, state):
            self.temperature = float(temperature.replace(',', '.')) if temperature != '-' else None
            self.humidity = int(humidity) if humidity != '-' else None
            self.state = state
    
    class NooLiteApi:
        """Базовый враппер для общения с NooLite"""
        def __init__(self, login, password, base_api_url, request_timeout=10):
            self.login = login
            self.password = password
            self.base_api_url = base_api_url
            self.request_timeout = request_timeout
    
        def get_sens_data(self):
            """Получение и прасинг xml данных с датчиков
    
            :return: список NooLiteSens объектов для каждого датчика
            :rtype: list
            """
            response = self._send_request('{}/sens.xml'.format(self.base_api_url))
            sens_states = {
                0: 'Датчик привязан, ожидается обновление информации',
                1: 'Датчик не привязан',
                2: 'Нет сигнала с датчика',
                3: 'Необходимо заменить элемент питания в датчике'
            }
            response_xml_root = ET.fromstring(response.text)
            sens_list = []
            for sens_number in range(4):
                sens_list.append(NooLiteSens(
                    response_xml_root.find('snst{}'.format(sens_number)).text,
                    response_xml_root.find('snsh{}'.format(sens_number)).text,
                    sens_states.get(int(response_xml_root.find('snt{}'.format(sens_number)).text))
                ))
            return sens_list
    
        def send_command_to_channel(self, data):
            """Отправка запроса к NooLite
    
            Отправляем запрос к NooLite с url параметрами из data
            :param data: url параметры
            :type data: dict
            :return: response
            """
            return self._send_request('{}/api.htm'.format(self.base_api_url), params=data)
    
        def _send_request(self, url, **kwargs):
            """Отправка запроса к NooLite и обработка возвращаемого ответа
    
            Отправка запроса к url с параметрами из kwargs
            :param url: url для запроса
            :type url: str
            :return: response от NooLite или исключение
            """
    
            try:
                response = requests.get(url, auth=HTTPBasicAuth(self.login, self.password),
                                        timeout=self.request_timeout, **kwargs)
            except ConnectTimeout as e:
                print(e)
                raise NooLiteConnectionTimeout('Connection timeout: {}'.format(self.request_timeout))
            except ConnectionError as e:
                print(e)
                raise NooLiteConnectionError('Connection timeout: {}'.format(self.request_timeout))
    
            if response.status_code != 200:
                raise NooLiteBadResponse('Bad response: {}'.format(response))
            else:
                return response
    
    # Кастомные исключения
    NooLiteConnectionTimeout = type('NooLiteConnectionTimeout', (Exception,), {})
    NooLiteConnectionError = type('NooLiteConnectionError', (Exception,), {})
    NooLiteBadResponse = type('NooLiteBadResponse', (Exception,), {})
    NooLiteBadRequestMethod = type('NooLiteBadRequestMethod', (Exception,), {})
    

    Используя его, в несколько строк python кода я набросал NooLite CLI, с помощью которого появилась возможность управлять NooLite из командной строки:


    noolite_cli.py
    """
    NooLite PR1132 command line interface
    """
    import os
    import json
    import logging
    import argparse
    
    import yaml
    
    from noolite_api import NooLiteApi
    
    SCRIPT_PATH = os.path.dirname(os.path.realpath(__file__))
    
    # Logging config
    logger = logging.getLogger()
    formatter = logging.Formatter(
        '%(asctime)s - %(filename)s:%(lineno)s - %(levelname)s - %(message)s'
    )
    stream_handler = logging.StreamHandler()
    stream_handler.setFormatter(formatter)
    logger.addHandler(stream_handler)
    
    def get_args():
        """Получение аргументов запуска
    
        :return:  словарь вида {название: значение} для переданных аргументов.
        :rtype: dict
        """
        parser = argparse.ArgumentParser()
        parser.add_argument('-sns', type=int, help='Получить данные с указанного датчика')
        parser.add_argument('-ch',  type=int, help='Адрес канала')
        parser.add_argument('-cmd', type=int, help='Команда')
        parser.add_argument('-br',  type=int, help='Абсолютная яркость')
        parser.add_argument('-fmt', type=int, help='Формат')
        parser.add_argument('-d0',  type=int, help='Байт данных 0')
        parser.add_argument('-d1',  type=int, help='Байт данных 1')
        parser.add_argument('-d2',  type=int, help='Байт данных 2')
        parser.add_argument('-d3',  type=int, help='Байт данных 3')
        return {key: value for key, value in vars(parser.parse_args()).items()
                if value is not None}
    
    if __name__ == '__main__':
        # Получаем конфиг из файла
        config = yaml.load(open(os.path.join(SCRIPT_PATH, 'conf_cli.yaml')))
    
        # Создаем объект для работы с NooLite
        noolite_api = NooLiteApi(
            config['noolite']['login'],
            config['noolite']['password'],
            config['noolite']['api_url']
        )
    
        # Получаем аргументы запуска
        args = get_args()
        logger.debug('Args: {}'.format(args))
    
        # Если есть аргумент sns, то возвращаем информацию с датчиков
        if 'sns' in args:
            sens_list = noolite_api.get_sens_data()
            send_data = sens_list[args['sns']]
            print(json.dumps({
                'temperature': send_data.temperature,
                'humidity': send_data.humidity,
                'state': send_data.state,
            }))
        else:
            logger.info('Send command to noolite: {}'.format(args))
            print(noolite_api.send_command_to_channel(args))
    

    Аргументы имеют такие же названия, как и в API ethernet-шлюза PR1132, единственное, что добавил — аргумент sns для получения информации с датчиков.


    # Помощь
    $ python noolite_cli.py -h
    usage: noolite_cli.py [-h] [-sns SNS] [-ch CH] [-cmd CMD] [-br BR] [-fmt FMT]
                          [-d0 D0] [-d1 D1] [-d2 D2] [-d3 D3]
    
    optional arguments:
      -h, --help  show this help message and exit
      -sns SNS    Получить данные с указанного датчика
      -ch CH      Адрес канала
      -cmd CMD    Команда
      -br BR      Абсолютная яркость
      -fmt FMT    Формат
      -d0 D0      Байт данных 0
      -d1 D1      Байт данных 1
      -d2 D2      Байт данных 2
      -d3 D3      Байт данных 3
    
    # Включение силового блока, привязанного к 0 каналу
    $ python noolite_cli.py -ch 0 -cmd 2
    OK
    
    # Выключение силового блока, привязанного к 0 каналу
    $ python noolite_cli.py -ch 0 -cmd 0
    OK
    
    # Получение информации с датчика, привязанного к 0 каналу
    $ python noolite_cli.py -sns 0
    {"state": "Датчик привязан, ожидается обновление информации", "temperature": 21.1, "humidity": 56}
    
    # Посложнее - задать RGB-контроллеру SD111-180 (3 канал) соответствующую яркость 
    # на каждый из цветовых каналов: d0 - красный, d1 - зеленый, d2 - синий
    $ python noolite_cli.py -ch 3 -cmd 6 -fmt 3 -d0 247 -d1 255 -d2 247

    Теперь я мог описать все силовые блоки NooLite в items:


    # /etc/openhab2/items/noolite.items
    
    Number FFTemperature "Температура [%.1f °C]" <temperature> {exec="<[python noolite_cli.py -sns 0:5000:JSONPATH($.temperature)]"}
    
    Number FFHumidity "Влажность [%d %%]" <temperature> {exec="<[python noolite_cli.py -sns 0:5000:JSONPATH($.humidity)]"}
    
    Switch  Heaters1 "Обогреватели" { exec=">[OFF:python noolite_cli.py -ch 0 -cmd 0] >[ON:python noolite_cli.py -ch 0 -cmd 2]"}
    
    Switch  Light1 "Освещение" { exec=">[OFF:python noolite_cli.py -ch 2 -cmd 0] >[ON:python noolite_cli.py -ch 2 -cmd 2]"}
    
    Color RGBLight "Светодиодная лента" <slider>

    где:


    • FFTemperature, FFHumidity — температура и влажность датчика первого этажа. OpenHab для получения информации каждые 5 секунд выполняет python noolite_cli.py с параметром -sns 0 и извлекает значения temperature из json ответа. Аналогично для влажности
    • Heaters1 — линия обогревателей первого этажа. Для включения (команда "ON") OpenHab должен выполнить python noolite_cli.py -ch 0 -cmd 2, для выключения (команда "OFF") — python noolite_cli.py -ch 0 -cmd 0.
    • Light1 — уличный прожектор, команды аналогичные обогревателям, только на втором канале -ch 2
    • RGBLight — светодиодная лента.

    Rules


    Управление светодиодной лентой уже не умещалось в одну команду, так как нужна была дополнительная логика для получения значений яркости каждого из RGB каналов. Поэтому обработку изменения состояния я описал в rules:


    # /etc/openhab2/rules/noolite.rules
    
    import org.openhab.core.library.types.*
    
    var HSBType hsbValue
    var String  redValue
    var String  greenValue
    var String  blueValue
    
    rule "Set RGB value"
    when
            Item RGBLight changed
    then
        val hsbValue = RGBLight.state as HSBType
        val brightness = hsbValue.brightness.intValue
        val redValue   = ((((hsbValue.red.intValue * 255) / 100) * brightness) / 100).toString
        val greenValue = ((((hsbValue.green.intValue * 255) / 100) * brightness) / 100).toString
        val blueValue  = ((((hsbValue.blue.intValue *255) / 100) * brightness) / 100).toString
    
        var String cmd = "python noolite_cli.py -ch 3 -cmd 6 -fmt 3 -d0 " + redValue + " -d1 " + greenValue + " -d2 " + blueValue
    
        executeCommandLine(cmd)
    end

    Я описал одно правило, которое срабатывало при изменении состояния RGBLight, где получал значения каждого канала (0-255), формировал строку python noolite_cli.py -ch 3 -cmd 6 -fmt 3 -d0 redValue -d1 greenValue -d2 blueValue и выполнял ее.


    Sitemap


    Теперь, когда OpenHab "видел" все мои силовые блоки и умел ими управлять, оставалось описать, как нужно их отображать в панели управления OpenHab (Basic UI, Classic UI). Делается это в sitemap:


    # /etc/openhab2/sitemap/noolite.sitemap
    
    sitemap noolite label="Дача" {
    
    Frame label="Первый этаж" {
        Text item=FFTemperature
        Text item=FFHumidity
            Switch item=Heaters1
            Switch item=Light1
        }
    
    Frame label="Второй этаж" {
        Colorpicker item=RGBLight icon="colorwheel" label="Светодиодная лента"
        }
    
    }

    После сохранения этого файла в Basic UI появились все устройства:


    image


    Также протестировал работу с умным домом через приложение OpenHab для iOS устройств, где тоже все отлично работало:


    image image





    Установка и настройка HomeKit для OpenHab


    Установку HomeKit аддона для OpenHab я произвел в пару кликов через Paper UI (интерфейс администрирования):


    image


    Для его корректной работы, следуя документации, для каждого элемента items прописал тип (Lighting, Switchable, CurrentTemperature, CurrentHumidity, Thermostat). После этого файл noolite.items имел следующий вид:


    Number FFTemperature "Температура [%.1f °C]" <temperature> [ "CurrentTemperature" ] {exec="<[python noolite_cli.py -sns 0:5000:JSONPATH($.temperature)]"}
    
    Number FFHumidity "Влажность [%d %%]" <temperature> [ "CurrentHumidity" ] {exec="<[python noolite_cli.py -sns 0:5000:JSONPATH($.humidity)]"}
    
    Switch  Heaters1 "Обогреватели" [ "Switchable" ] { exec=">[OFF:python noolite_cli.py -ch 0 -cmd 0] >[ON:python noolite_cli.py -ch 0 -cmd 2]"}
    
    Switch  Light1 "Освещение" [ "Switchable" ] { exec=">[OFF:python noolite_cli.py -ch 2 -cmd 0] >[ON:python noolite_cli.py -ch 2 -cmd 2]"}
    
    Color RGBLight "Светодиодная лента" <slider> [ "Lighting" ]

    Затем в настройках аддона прописал локальный адрес устройства c OpenHab (в моем случае Raspberry Pi) и посмотрел pin-код сопряжения:


    image



    image

    После этого с настройками OpenHab было закончено, и я приступил к конфигурированию умного дома на iphone в приложении "Дом".





    Настройка приложения «Дом»


    image
    Первый запуск приложения "Дом"


    image
    Нажал "Добавить аксессуар"


    image
    iPhone увидел в локальной сети устройство с поддерждок HomeKit


    image
    Ввести код вручную


    image
    При добавлении указал pin-код из настроек HomeKit аддона


    image
    Все устройства


    iPhone увидел все мои устройства, описанные в items. Далее я переименовал некоторые устройства, создал "комнаты" (первый этаж, второй этаж, улица) и раскидал все устройства по ним.


    Здесь я хочу пояснить один момент. На скриншоте выше виден элемент "Температура на улице" (первый элемент с показателем 2 градуса), находящийся в комнате "Улица". Этот элемент реализован с использованием биндинга YahooWeather Binding — по сути просто прогноз погоды от yahoo для конкретного места.


    image


    К NooLite он не относится, поэтому я не затронул подробности его установки и настройки. Сделать это можно опять же через Paper UI, все подробно изложено в документации.


    Удаленный доступ и автоматизация


    В моей локальной сети находился Apple TV, который без дополнительных настроек сам определился как "Домашний центр". Как я позже выяснил, домашний центр необходим для удаленного доступа к умному дому и настройки автоматизации (действия по расписанию, действия на основе вашей геопозиции и т.д.). В качестве домашнего центра может выступать Apple TV 3 или 4 поколения (в 3 поколении работает только удаленный доступ, для автоматизации нужно 4 поколение) или iPad с iOS 10. Это устройство должно быть постоянно включено и находится в локальной сети умного дома.
    Приятно порадовало то, что никаких дополнительных настроек с Apple TV я не делал. Все, что нужно — это войти в iCloud под своей учетной записью.





    Результат


    Нагляднее всего процесс работы можно показать с помощью видео. Ниже приведу несколько примеров работы приложения "Дом" и голосового управления через Siri:





    В щитке 2 крайних правых места нанимают контакторы, управляемые силовыми блоками NooLite серии SL. Через них подключены линии обогревателей на первом и втором этаже дома. На видео слышно, как они щелкают при включении/выключении. К сожалению нет более наглядной индикации их работы.


    В начале следующего видео я отключаюсь от дачной Wi-Fi сети и вся дальнейшая работа с умным домом происходит через мобильный 3G интернет.








    Заключение


    Интеграция с HomeKit позволила добавить к умному дому удобный интерфейс управления с iOS устройств через приложение "Дом", а так же расширила его функционал:


    • полноценное удаленное управление всеми устройствами дома, вместо Telegram-бота
    • голосовое управление
    • автоматизацию на основе: времени суток, геолокации, показаний датчиков (например обнаружение движения)
    • удобное добавление пользователей к управлению умным домом через приглашения (нужно наличие iOS устройства и учетной записи Apple) с разграничением прав доступа

    Подробный обзор самого приложения "Дом" и его применения для домашней автоматизации уже выходит за рамки данной темы и думаю, что заслуживает отдельной статьи. Но для меня самым интересным является геолокация, на основе которой можно реализовать интересные сценарии автоматизации. Например когда все пользователи дома уходят из него, то можно выключить везде свет. Если пользователи удалились еще дальше (уехали в город), то выключаем некоторые потребители, например розетки и электричество в подвале (у меня там расположена насосная станция).


    Работа над данной статьей позволила взглянуть на систему управления загородным домом со стороны и отметить те места, которые в ближайшем будущем буду дорабатывать:


    • для упрощения системы вместо использования ethernet-шлюза PR1132 и управления NooLite блоками через HTTP API можно использовать USB-адаптеры RX и PC серий и отдавать команды напрямую
    • насколько мне известно, в ближайшее время NooLite планирует выпустить новый USB-приемо-передающий адаптер и силовые блоки с обратной связью. Будет очень интересно попробовать их в деле.

    Ссылки:


    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 19
    • 0
      Даже на презентации эпла не было такой эффектной демонстрации Home Kit!
      Круто! Молодец!
    • 0

      Очень круто!!! Респект!


      У меня HomeKit завелся со второй попытки, и то не все items были видны, только phillips hue (старой модели). А вот MiLight не заработал через HK. Только через веб интерфейс OpenHab, да и то кривовато как-то. Включались-выключались только при изменение яркости. Надо будет поковыряться с SiteMap...

      • 0

        Спасибо!


        У меня тоже все не с первого раза заработало, но все свелось к просмотру ошибок в логах и правке конфигурационных файлов OpenHab (items, sitemap, rules). Больше времени потратил как раз на то, чтобы заставить OpenHab корректно работать с NooLite. А с HomeKit аддоном особых проблем не возникло. Единственное — не сразу понял, что для него важен порядок, в котором будут указаны атрибуты, описывающие устройство в items:


        Switch  Light1 "Освещение" [ "Switchable" ] {<binding>}

        Важно, что бы [ "Switchable" ] был указан именно в этом месте.

      • 0
        Каким образом HomeKit помогает с геолокацией? У себя геолокацию на OH реализовал связкой биндинга MQTTitude+приложения OwnTracks и дополнительно биндинга Network Health Binding
        • 0
          Приложение Дом, при наличии домашнего центра (Apple TV 4 поколения или iPad), позволяет задавать автоматизации на основе геопозиции пользователей умного дома. Выглядит это следующим образом:

          Экран создания автоматизации на основе геопозиции
          image


          То есть домашний центр постоянно отслеживает геопозицию пользователей и выполняет действия, в соответствии с заданными правилами.
          • 0
            Речь идет о всех пользователях умного дома, или только о пользователях- владельцах айфонов, привязанных к одному ЭпплАйДи?
            • 0
              Не могу точно ответить на данный вопрос, так как еще не тестировал данный функционал. В приложении «Дом» я могу приглашать пользователей по их Apple ID и управлять их правами, что подразумевает наличие у них apple устройств. Членов своей семьи я добавил подобным образом (Apple ID у них всех разные), и дом имеет доступ к их геопозициям.

              Однако при создании автоматизации, приложение не предлагает выбор тех пользователей, с которыми эта автоматизация должна работать. Я предполагаю, что он учитывает положения всех добавленных к управлению домом пользователей, и скрипт срабатывает только в случае когда все они покинули или кто-то из них зашел в заданную зону. Если он учитывает только мою геопозицию, то это весьма ограничит возможность применения такой автоматизации.

              К сожалению, смогу проверить мою теорию только на выходных.
              • 0
                Спасибо, очень хочется проверить теорию))
                • 0
                  Удалось проверить теорию?
                  • 0
                    Вот только вчера появилась возможность проверить. Результат: автоматизация на основе геопозиции учитывает только мои устройства, то есть те, где выполнен вход в мою учетную запись iCloud. Устройства других членов семьи он, к сожалению, не учитывает.

                    Тестировал следующие сценарии:
                    • iPad был дома, я ушел с телефоном — сценарий не сработал,
                    • Взял iPad и iPhone — сценарий сработал.
          • 0
            «Привет, Siri. Включи обогреватели»

            Это не умный дом.
            Умный дом должен сам сообразить, когда включать обогреватели и какую температуру установить.

            • 0
              «Вот что мне удалось найти в интернете по запросу „включи обогреватели“»
              ;-}
              • 0
                Именно это в большинстве случаев Вы и услышите.
                Я не знаю с чем это связано: плохим распознаванием русского языка в целом, ее реализацией в HomeKit или плохой дикцией всей моей семьи, но это раздражает. Часто быстрее дойти до выключателя, чем заставить Siri выключить свет.
                Есть и еще проблемы:
                1) В новой редакции Apple позволила присваивать одинаковые названия устройствам в разных комнатах, но есть большое количество уже занятых Siri имен которые использовать не получится. Я уже как-то писал про невозможность «включить елку» (речь про новогоднюю).
                2) Часть наименований Siri распознает, но делает вид что «не знает, что с этим делать». Например слово «бра». Речь про настенное бра :). «Включить компьютер» тоже не получилось.
                3) У меня более 15 источников света и я так и не придумал им всем имена. Такие варианты как «Лампа один» и «Лампа два» не подходят, т.к. по команде «Выключи лампу», Siri выключает вообще весь свет в квартире. Тоже самое со словом «Светильник». Дать всем уникальные имена собственные? Не перебор ли?
                4) Эта ужасная ключевая фраза «Привет, Siri». Через какое-то время от слова «привет» воротит до нельзя. Вы в жизни каждую просьбу начинаете с «привет»? Даже если с человеком уже 100 раз за сегодня виделись? Ужасно.

                В общем хоть это и работает, но моя семья к этому так и не привыкла.

                Чего не скажешь про Amazon Alexa. Здесь все с точностью до наоборот. Все распознается в 99%случаев четко. Проблем с именами устройств не наблюдается, как назвал, так и откликаются. Быстрая ключевая фраза «Alexa», которая сама по себе естественна, как буд-то обратился к жене, так еще и перенастроить ее можно на любую другую. Alexa же грузят вопросами, просьбами, указаниями просто постоянно. Возможно просто дело в том, что с ней общение идет на английском. Не знаю. Надо попробовать и Siri на английском, но желания как-то все меньше и меньше.
            • 0
              Это… прекрасно! Вот после таких постов, появляется желание что-то переделать дома, автоматизировать, зарыться в кучу проводов и блоков управления!
              • 0
                Супер!!! Огромное спасибо!!!
                • 0
                  А почему для Homekit не использовать https://github.com/nfarina/homebridge?
                  • 0
                    Видел его — очень интересное решение. Как появится возможность, хочу попробовать поработать с ним.

                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.