Найти тему
GHz

Создание компонента Home Assistant. Просто и в картинках. Часть 1. Настройка VSCode и Remote-SSH

Оглавление

В этом цикле статей мы опробуем современные технологии разработки для создания компонента умного дома Home Assistant. Подробно и поэтапно рассмотрим процесс создания рабочего окружения, напишем примитивный компонент для умного дома, усложним его и сделаем полезным.

Рисунок 0. Первый самодельный компонент
Рисунок 0. Первый самодельный компонент

Это первая статья из запланированного цикла о создании собственного компонента для системы умного дома Home Assistant. Здесь мы настроим среду разработки VSCode и настроим подключение к серверу с использованием Remote-SSH.

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

  • Настройка среды разработки VScode;
  • Подключение VSCode к серверу;
  • Настройка Docker и Docker-compose;
  • Изучения архитектуры системы Home Assistant;
  • Анализ REST API внешнего сервиса;
  • Создание собственного компонента;
  • И, может даже, попробуем добавить его к основному коду Home Assistant.

Читая про современные технологии, безусловно, хочется познакомиться с ними, оценить эффективность и удобство их применения. Для создания собственного простого компонента будем использовать Docker. Это современно, удобно, интересно =) Для разработки я использую самодельный NAS (сетевое хранилище, сервер), на который установлен Docker Engine.

Потому рабочий процесс будет происходить так: запускаем VSCode на компьютере, подключаемся с помощью Remote-SSH к серверу, пишем код компонента, запускаем docker-контейнер, тестируем. Повторяем до получения желаемого результата.

Ремарка: не являюсь профессиональным разработчиком, интерес к технологиям это хобби, потому любой может повторить и расширить мой опыт.

Постановка задачи: настроить современное окружение для разработки простого компонента Home Assistant.

Это статья будет проста и понятна для тех, кто:

  • Имеет небольшой опыт с OS Linux;
  • Представляет, что такое docker-контейнеры;
  • Может по образцу написать команды языка программирования Python.

Что потребуется:

  • Компьютер для разработки. У меня это обычный десктоп с Windows 10;
  • Сервер с установленным Docker ( Ubuntu 18.04.03 LTS, Docker Engine CE 19.03.4, Docker-compose 1.17.1 );
  • Локальная сеть, объединяющая эти два устройства.

1. Подключение VSCode к удалённому серверу используя расширение Remote-SSH

Установим среду разработки VSCode, скачать по ссылке. Я использую версию без инсталлятора (вариант *.zip для windows 10).

Для начала необходимо подключиться к удалённому серверу с Docker. Для этого установим расширение Remote-SSH. Для поиска расширения в Marketplace используем сочетание клавиш Ctrl+Shift+X (или на вкладке слева иконка Extensions – рис. 1a). Вводим в поисковую строку (рис. 1b) название расширения, находим Remote-SSH (рис. 1c) и устанавливаем.

Рисунок 1. Установка Remote-SSH
Рисунок 1. Установка Remote-SSH

Обратим внимание на область, выделенную красной рамкой в левом нижнем углу экрана. После установки (Рис.2a) появится иконка «><» и надпись, что расширение включено (Рис.2b).

Кликнем на иконку «><» (Рис. 3a) и в строке команд появятся команды расширения Remote-SSH. Выбираем «Open configuration file…» (Рис. 3б). Из появившегося списка выбираем конфиг, который хранится в папке пользователя (Рис. 4).

Начальное состояние конфигурационного файла показано на рис.5 и листинге 1.

Рисунок 5. Исходное состояние конфиг-файла Remote-SSH
Рисунок 5. Исходное состояние конфиг-файла Remote-SSH

Теперь необходимо настроить параметры SSH-подключения к своему серверу. Поскольку мой сервер настроен на авторизацию только по ключам (это правильно, с точки зрения безопасности, да и удобнее), то при настройке соединения необходимо указать соответствующий параметр IdentityFile. Список параметров конфигурационного файла:

  • Host – псевдоним (пишем удобное для себя название);
  • Hostname – домен или IP-адрес сервера;
  • User – имя пользователя, под которым будет происходить аутентификация;
  • IdentityFile – путь к приватному ключу.

Мой конфиг выглядит так (Рис. 6, Листинг 2):

Рисунок 6. Отредактированный конфиг-файл Remote-SSH
Рисунок 6. Отредактированный конфиг-файл Remote-SSH

Пробуем подключиться: нажимаем на иконку “><” и в строке команд (вверху экрана) выбираем «Remote-SSH: Подключиться к хосту…» и выбираем сконфигурированное подключение (в моём случае – «NAS» ) - Рис. 7 . Соглашаемся сделать отпечаток ключа (Рис. 8).

И-и-и здесь появляется ошибка (рис.9). Закрываем окно ошибки, нажав на крестик в правом верхнем углу окна диалога. Листаем в окошке «OUTPUT» вверх (рис.10, область в красной рамке) и находим причину ошибки (рис.10):

Ошибка говорит о том, что приватный ключ слишком «открытый», а необходимо, чтобы он был недоступен другим – этакий приватный ключ лёгкого поведения =). Чтобы обезопасить ключ и продолжить настройку расширения необходимо дать права чтения только владельцу файла ключа. Для этого: кликаем правой кнопкой мыши на файл приватного ключа, выбираем пункт «свойства», вкладка «Безопасность», кнопка «Дополнительно». Удаляем всех, кроме владельца, отключаем наследование (Рис. 11).

Рисунок 11. Настройка прав доступа к приватному ключу
Рисунок 11. Настройка прав доступа к приватному ключу

Пробуем подключиться к серверу по SSH (по инструкции ниже Рис. 6). Ну… как так-то? Опять ошибка, но уже другая. На Рис.12 красной рамкой выделана область, где показано что права на чтение и выполнение файла приватного ключа есть только у владельца файла. На этом же рисунке стрелкой показана новая ошибка:

Рисунок 12. Неверный формат приватного ключа
Рисунок 12. Неверный формат приватного ключа

Ошибка означает неверный формат приватного ключа. Это возникает в том случае, когда ключ генерируется в Windows использованием PuttyGen. Чтобы устранить ошибку, достаточно сконвертировать приватный ключ в формат OpenSSH. Для этого открываем PuttyGen (где и создавалась пара ключей), в меню сверху выбираем «File» -> «Load private key» и выбираем файл ключа, который используем для SSH-подключения. В меню сверху выбираем «Conversions» -> «Export OpenSSH key» и сохраняем приватный ключ в формате SSH.

Открываем конфигурационный файл SSH-подключения (инструкция ниже Рис. 1) и указываем путь до файла приватного ключа в формате OpenSSH (Рис.14):

Рисунок 14. Отредактированный конфигурационный файл Remote-SSH
Рисунок 14. Отредактированный конфигурационный файл Remote-SSH

ВНИМАНИЕ: для нового файла ключа необходимо повторить предыдущий пункт с правами доступа: дать права на чтение и выполнение только владельцу, остальных пользователей удалить. Теперь пробуем подключиться к SSH-серверу (по инструкции ниже Рис. 6 ).

Ура! Подключение прошло успешно! На стороне сервера установился сервер VSCode и был успешно инициализирован. В левом нижнем углу видим статус успешного подключения к серверу по SSH (Рис. 15).

Рисунок 15. Успешное подключение к NAS
Рисунок 15. Успешное подключение к NAS

В следующей статье рассмотрим настройку Docker и Docker-compose.

Для опытных пользователей

Здесь я немного напишу про то как вижу концепцию и разработки, и с какими сложностями пришлось столкнуться. Не обязательно к прочтению. Изначально я рассчитывал, что расширение Remote-Containers позволит подключиться к Docker Engine на NAS и уже в контейнере на удалённом Docker Engine ведём разработку. Но оказалось, что Remote-Containers подразумевает наличие Docker Engine на десктопе. Окей, расширение Remote-SSH (о чём кратко рассказано выше) позволяет нам подключиться к NAS по SSH и взаимодействовать с файловой системой NAS. Пытаюсь настроить Remote-Containers при установленном с помощью Remote-SSH подключении к NAS. Не получается, поскольку функционал Remote-Containers недоступен при активном подключении Remote-SSH.

Поиск информации для понимания и способов решения проблемы дали один вариант: SSH-туннель между десктопом и NAS. Этот вариант тоже довольно неудобен (на мой взгляд), поскольку это не выглядит естественным и автоматизированным (не обеспечивает достойный пользовательский опыт от workflow, ага). Гуглю ещё варианты, нахожу костыли и ожидания сообщества, когда VSCode сможет работать с удалённым Docker Engine без локального экземпляра DockerEngine.

Пруфы: один и два.

Если вам интересны следующие статьи по этой и смежным темам - подписывайтесь на мой канал!