Страницы

вторник, 7 августа 2018 г.

Интеграция умного дома Xiaomi Mi Home в Google Assitant

Являюсь латентным фанатом Xiaomi, то есть я хожу с Samsung, а тёще и сестре дарю Xiaomi, а ещё умный дом и другие гаждеты дома собрал от Xiaomi. На самом деле, они рулят. И вот в России появился Google Assitant и я решил прикрутить к нему систему умного дома MiHome.

К сожалению, напрямую из Google Assistant можно управлять только некоторыми лампочками Xiaomi, а Zigbee выключатели, управляемые шлюзом Xiaomi Gateway 2 недоступны. К счастью (или несчастью), к моменту прихода Google Assistant в Россию прошло несколько лет и много разных сервисов интегрировалось в Google Assistant.
Среди них и IFTTT (If This Than That), который позволяет вешать триггеры к Google Assitant (и кучам других сервисов) и вызывать по ним любые службы, включая вебхуки, на которые можно повесить внешние сервисы типа Domoticz или Home Assistant (системы умного дома, которые поддерживают шлюзы Xiaomi Gateway 2).
Domoticz проявил себя хуже. Он плохо поддерживает несколько шлюзов, интерфейс оставляет желать лучшего, многие датчики дублируются почему-то, а некоторые выключатели не добавились.
Home Assistant, наоборот из коробки оказался готовым решением. Установив по инструкции, в интерфейсе сразу появились шлюзы, которые видны в той же подсети. Нужно только прописать конфигурацию с ключами в /home/homeassistant/.homeassistant/configuration.yml для xiaomi_aqara и для ifttt:
xiaomi_aqara:
  gateways:
    - mac: 34ce00XXXXXX
      key: ******
    - mac: 34ce00XXXXXX
      key: ******
    - mac: 7811dcXXXXXX
      key: ******
    - mac: 7811dbXXXXXX
      key: ******
    - mac: 34ce00XXXXXX
      key: ******
      host: 192.168.77.xxx
    - mac: 34ce00XXXXXX
      key: ******
      host: 192.168.0.xxx

ifttt:
  key: ******
И перезапустить Home Assistant. Как прописал ключи - выключатели начали работать.
Для того чтобы открыть в Интернет, нужно ещё защитить Home Assistant паролем:
http:
  # Secrets are defined in the file secrets.yaml
  api_password: !secret http_password
  # Uncomment this if you are using SSL/TLS, running in Docker container, etc.
  use_x_forwarded_for: true
  trusted_proxies:
    - 127.0.0.1
    - 192.168.1.4
  base_url: xn--d1aqf.xn--80aibxmt.xn--p1ai
в файле secrets.yaml прописываем пароль в plain text формате.
Как добавить в автозапуск описано в специальном разделе.

Nginx законфигурировать по инструкции:
server_names_hash_bucket_size 64;

server {
        listen 443 ssl;
        listen [::]:443 ssl;

        ssl_certificate /etc/nginx/certs/xn--80aibxmt.xn--p1ai/fullchain.pem;
        ssl_certificate_key /etc/nginx/certs/xn--80aibxmt.xn--p1ai/privkey.pem;

        server_name xn--d1aqf.xn--80aibxmt.xn--p1ai;

        location / {
                proxy_pass http://localhost:8123;
                proxy_set_header Host $host;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        }

        location /api/websocket {
                proxy_pass http://localhost:8123/api/websocket;
                proxy_set_header Host $host;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        }
}
Сертификаты можно получить с помощью acme.sh:
acme.sh --issue -d xn--80aibxmt.xn--p1ai -d '*.xn--80a ibxmt.xn--p1ai' --dns dns_yandex --install-cert
При этом у меня возникла проблема, домен являлся алиасом другого домена pdd. Запатчил так:
diff --git a/dnsapi/dns_yandex.sh b/dnsapi/dns_yandex.sh
index 318dee0..95becf2 100755
--- a/dnsapi/dns_yandex.sh
+++ b/dnsapi/dns_yandex.sh
@@ -60,6 +60,8 @@ _PDD_get_domain() {
     fi

     __all_domains="$__all_domains $(echo "$res1" | tr "," "\n" | grep '"name"' | cut -d: -f2 | sed -e 's@"@@g')"
+    __all_domains="$__all_domains $(echo $res1 | jq -r '.domains[].aliases[]')"

     __page=$(_math $__page + 1)
   done
--
Далее делаем раскладку (затем она будет производиться по крону автоматически): 
sudo mkdir -p /etc/nginx/certs/xn--80aibxmt.xn--p1ai
sudo chmod 777 /etc/nginx/certs/xn--80aibxmt.xn--p1ai
acme.sh --install-cert -d xn--80aibxmt.xn--p1ai --key-file /etc/nginx/certs/xn--80aibxmt.xn--p1ai/privkey.pem --fullchain-file /etc/nginx/certs/xn--80aibxmt.xn--p1ai/fullchain.pem --reloadcmd "sudo /bin/systemctl reload nginx.service"
На этом всё с бекендом.
Далее в IFTTT настраиваем события и управляем домом через Google Assitant.
Как описано в API: заставим дёргать URL https://xn--d1aqf.xn--80aibxmt.xn--p1ai/api/services/switch/turn_{{TextField}}?api_password=****** по команде "turn $ porch lights".






Проверим это в Google Assitant.
Профит!