В этой статье я расскажу, как я создал систему автоматизации умного дома с Angular и Node.js на Raspberry Pi, не полагаясь на какие-либо внешние облачные сервисы.

(Обновлено в мае 2020 г.)

вступление

В последние несколько дней я провел несколько ночей, проектируя и разрабатывая систему домашней автоматизации на основе JavaScript с использованием Angular и Node.js. И, как и в случае с любым другим проектом, планирование включало в себя глубокое исследование Интернета.

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

Ни одно из решений не имело для меня никакого смысла. Все варианты были либо дорогими, либо имели неудобную реализацию или даже недостатки безопасности.

Но прежде чем мы продолжим, давайте объясним, что такое MQTT. MQTT означает MQ Telemetry Transport. Это чрезвычайно простой и легкий протокол обмена сообщениями для публикации / подписки. MQTT разработан для устройств с ограниченными возможностями и сетей с низкой пропускной способностью, большими задержками или ненадежными сетями.

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

Почему меня не убедили в использовании MQTT или каких-либо решений, которые я нашел в Интернете? Две причины:

  1. Хотя технология MQTT кажется очень удобной для устройств IoT, я все же считал ее ненужной. Система, которую я покажу в следующем руководстве, работает в той же среде, где находятся устройства IoT. Все преимущества MQTT за то, что он «быстрый» и «низкая пропускная способность», становятся неактуальными. Кроме того, есть все хлопоты, связанные с его реализацией, и все дополнительные накладные расходы, связанные с дополнительными пакетами npm, которые необходимы для его работы в среде JavaScript. Вместо этого я буду использовать только общие библиотеки JavaScript и Node.js, не более того!
  2. А как насчет части безопасности? Что ж, я не большой поклонник «облака» или облачных вычислений в целом. В некоторых случаях это может быть очень полезно, но в большинстве случаев в этом нет необходимости. Подумайте об этом: зачем вам служба, необходимая для управления вашей бытовой техникой, которая должна быть размещена где-то еще в «облаке», а не в вашей собственной сети?

Можно подумать, что «облако» предоставляет возможность доступа к вашей бытовой технике из любой точки мира через Интернет.

Но подумайте вот о чем: когда в вашей домашней сети нет подключения к Интернету, облако становится избыточным. Что еще более важно, вы все равно можете сделать свою систему домашней автоматизации доступной из Интернета. Я рекомендую создать безопасный туннель обратного прокси с помощью ngrok. Таким образом, вам не нужно раскрывать адрес своей сети.

с ngrok вы получите веб-интерфейс в реальном времени, в котором вы сможете анализировать весь HTTP-трафик:

Технология

  1. Программное обеспечение. Я выбрал Angular и Node.js потому, что они основаны на JavaScript, и я уже знаком с ними. В конце концов, я хотел спроектировать и разработать прогрессивное веб-приложение, которое взаимодействует с моими IoT-устройствами через HTTP, а JavaScript предлагал все необходимые мне функции.
  2. Аппаратное обеспечение: система работает с микроконтроллерами, такими как Arduino Uno / Mega / Du / MKR1000, Adafruit HUZZAH CC3000, а также с любыми другими микроконтроллерами с подключением Wi-Fi. Я использую ESP8266 в качестве базового компонента для моей системы домашней автоматизации. Это недорогая микросхема WiFi с функциями микроконтроллера. В нем есть все, что мне нужно, и по низкой цене! Наконец, нам нужно разместить систему где-нибудь в нашей локальной сети - что может быть лучше Raspberry Pi?

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

Установка

По моим оценкам, на завершение всей этой установки уйдет около 40 минут плюс время, потраченное в Интернете на поиск решений для ошибок установки.

Что нужно?

Требуется Raspberry Pi. В моем примере я использую Raspberry Pi 3, но он должен работать с большинством версий. Необходимые компоненты:

  1. Плата Raspberry Pi
  2. Карта MicroSD (рекомендуется класс 10 с объемом памяти 16 ГБ или выше)
  3. Кардридер USB MicroSD или адаптер SD-карты
  4. Монитор HDMI и клавиатура USB (требуется временно только для первой загрузки Raspberry Pi)
  5. Кабель Ethernet (не требуется для Raspberry Pi 3, поскольку он имеет встроенный Wi-Fi)

Установка сервера Ubuntu на Raspberry Pi

Я рекомендую 64-разрядную версию Ubuntu 18.04.4 LTS.

  1. Загрузите самую последнюю картинку с официального сайта.
  2. Запишите образ на SD-карту с помощью программы Raspberry Pi Imager или любого другого программного обеспечения для записи образов ОС по вашему выбору.

Настройка Raspberry Pi

Чтобы подготовить Raspberry Pi к загрузке, нам необходимо:

  1. Вставьте карту MicroSD в Raspberry Pi
  2. Подключите USB-клавиатуру и кабель HDMI.
  3. Подключите кабель Ethernet.

Включение SSH и изменение имени пользователя и пароля

Откройте свой терминал с помощью сочетания клавиш Ctrl+Alt+T или щелкнув значок терминала и установив пакет openssh-server, набрав

$ sudo apt update
$ sudo apt install openssh-server

После завершения установки служба SSH запустится автоматически.

Настройка удаленного доступа к Raspberry Pi

Теперь, наконец, часть, когда мы устанавливаем необходимое программное обеспечение на Raspberry Pi. Эта часть может быть выполнена непосредственно на Pi через терминал с помощью монитора HDMI и USB-клавиатуры. Для удобства - и поскольку мы разрешаем удаленное соединение SSH - мы собираемся подключаться из другой среды рабочего стола. Это лучший и самый простой способ удаленного доступа к Pi и управления им всякий раз, когда требуются изменения и конфигурации.

Итак, в основном, вот как вы можете получить доступ к интерфейсу командной строки Raspberry Pi удаленно с другого компьютера или любого устройства в той же сети, используя SSH. Это можно сделать двумя способами:

  1. Используя командную строку или PowerShell (я использую Windows на настольном компьютере), замените свое имя пользователя и IP-адрес.
$ ssh username@ipaddress

Если вы не знаете IP-адрес, введите «hostname -I" в командной строке Raspberry Pi.

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

Установка необходимого программного обеспечения на Raspberry Pi

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

  1. Обновите список системных пакетов, используя следующую команду:
$ sudo apt-get update

2. Обновите все установленные пакеты до последней версии:

$ sudo apt-get dist-upgrade

3. Загрузите и установите последнюю версию Node.js:

// To download
$ curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
// To install
$ sudo apt-get install -y nodejs
// Check if the installation was successful:
$ node -v

4. Установите систему контроля версий Git:

$ sudo apt-get install git

Установка базы данных (MongoDB)

Нам нужна база данных для хранения зарегистрированных пользователей и их учетных данных. Вот необходимые шаги:

  1. Установить MongoDB
$ sudo apt-get install mongodb

2. Запустите процесс MongoDB.

$ sudo service mongodb start

3. Запустите mongo Shell.

$ mongo

3. Создайте базу данных под названием «smarthaus».

$ use smarthaus

В MongoDB база данных по умолчанию - test. Если вы не создавали ни одной базы данных, то коллекции будут храниться в тестовой базе данных.

Установка Smart Haus

1. Проверьте текущий рабочий каталог с помощью этой команды:

$ pwd
It will probably print: "/home/pi"
where "pi" is the current user directory

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

2. Клонируйте репозиторий из:

$ git clone https://github.com/amiroffme/smarthaus.git

Обязательно перейдите в каталог, используя:

$ cd smarthaus

Перед установкой любых пакетов npm с помощью npm install ознакомьтесь с руководством по npm для исправления разрешений, чтобы узнать, как исправить любые ошибки EACCESS, с которыми вы можете столкнуться во время установки. . Это очень важно, поскольку это предотвратит любые ошибки разрешения npm и позволит вам устанавливать пакеты глобально без использования sudo. Использование sudo с npm не рекомендуется и следует избегать.

3. Установите все необходимые пакеты для проекта:

$ npm install

Запуск сервера Node.js

Перед запуском сервера нам нужно собрать проект с помощью инструмента Angular CLI. И, наконец, мы настраиваем Raspberry Pi так, чтобы он запускал сервер при каждой загрузке.

  1. Установите Angular cli (глобально):
$ npm install -g @angular/cli

2. Создайте проект, используя:

$ ng build --prod

3. Отредактируйте rc.local файл, используя nano:

$ sudo nano /etc/rc.local

4. Добавьте следующее в строку перед exit 0, затем выйдите и сохраните файл:

su ubuntu -c 'cd /home/ubuntu/smarthaus/backend && sudo node server.js > server.log &'

Сервер Node.js готов! Он будет запускаться при каждой загрузке системы и сохранять журналы в том же каталоге в файле «server.log».

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

$ sudo node server

Система теперь доступна с любого устройства в вашей сети через IP-адрес Raspberry Pi.

Пожалуйста, сделайте вилку этого проекта и примите участие в разработке недостающих частей 👍

Конец

Мы получили работающую систему домашней автоматизации, которая безопасно работает на Raspberry Pi в нашей локальной сети без использования «облака» или чьего-либо другого сервера.

Мой Raspberry Pi сидит рядом с моим Fingbox и роутером в гостиной 😍

Надеюсь, вам понравилось читать.
Пожалуйста, подпишитесь и поделитесь, чтобы узнать больше о технологиях 🤖💖