В одной из предыдущих статей на нашем сайте мы рассмотрели основы протокола MQTT и установили на Raspberry Pi локальный MQTT сервер, с помощью которого мы управляли контактами ввода-вывода (GPIO) платы. Очевидным недостатком такого решения является то, что с помощью локального MQTT сервера мы не можем управлять контактами платы Raspberry Pi из любой точки земного шара, где есть сеть интернет. Но если мы установим MQTT сервер на каком-нибудь облачном сервисе (облаке, cloud), тогда мы сможем управлять контактами платы Raspberry Pi глобально (из любой точки Земли).
В данной статье мы будем использовать сервис Adafruit IO в качестве MQTT брокера и с его помощью будем управлять потребителями переменного тока (домашними устройствами), подключенными к контактам платы Raspberry Pi. Фактически, этот проект можно рассматривать как проект автоматизации дома на основе платы Raspberry Pi и MQTT облака (MQTT Cloud).
Также на нашем сайте вы можете посмотреть много других проектов автоматизации дома. Наиболее популярным среди них оказался проект автоматизации дома на Raspberry Pi с управлением с веб-страницы.
Необходимые компоненты
- Плата Raspberry Pi (купить на AliExpress) (Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158).
- Модуль реле.
- Электрическая лампа переменного тока (Bulb).
- Соединительные провода.
В нашем проекте мы использовали удаленное управление платой Raspberry Pi по протоколу SSH. Вы можете использовать любой другой удобный для вас способ взаимодействия с платой Raspberry Pi.
Схема проекта
Схема автоматизации дома на основе платы Raspberry Pi и MQTT облака представлена на следующем рисунке.
Как видите, схема очень проста – достаточно лишь подключить к контакту GPIO 35 платы Raspberry Pi модуль реле, с помощью которого мы будем управлять включением/выключением лампы переменного тока.
Внешний вид собранной конструкции проекта показан на следующем рисунке.
Установка на Raspberry Pi библиотек для работы с MQTT облаком
В данном проекте мы будем использовать платформу Adafruit IO вместе с платой Raspberry Pi в качестве MQTT брокера. Для этого вам необходимо зарегистрироваться на сервисе Adafruit IO и создать себе там фид (feed).
После получения доступа к панели инструментов платформы Adafruit IO необходимо установить на плату Raspberry Pi ряд библиотек чтобы иметь возможность работы с протоколом MQTT. Для этого выполним следующую последовательность шагов.
1. Установим последние обновления на плату и оболочку Python с помощью команд:
1 2 3 |
sudo apt-get update sudo apt-get upgrade sudo pip3 install --upgrade setuptools |
- Установим библиотеки Rpi.gpio и Adafruit blink с помощью команд:
1 2 |
sudo pip3 install RPI.GPIO sudo pip3 install adafruit-blinka |
3. Установим библиотеку Adafruit IO.
1 |
sudo pip3 install adafruit-io |
4. Клонируем примеры adafruit с github с помощью команды:
1 |
git clone https://github.com/adafruit/Adafruit_IO_Python.git |
5. Перейдем в необходимый нам каталог с примерами.
1 |
cd Adafruit_IO_Python/examples/basics |
Если вы не знаете в каком каталоге вы находитесь в текущий момент времени вы можете проверить это с помощью команды pwd.
6. Для всех примеров в указанном каталоге вам будут необходимы ADAFRUIT_IO_KEY (ключ) и ADAFRUIT_IO_USERNAME (имя пользователя), которые можно найти в панели инструментов Adafruit.
Нажмите показанную на рисунке кнопку в панели инструментов Adafruit чтобы увидеть необходимую информацию в терминале Raspberry Pi.
7. Теперь откройте файл subscribe.py в редакторе nano. Это можно сделать с помощью команды:
1 |
sudo nano subscribe.py |
Мы будем редактировать (писать программу) этот файл чтобы управлять контактами платы из панели инструментов Adafruit.
Объяснение программы для Raspberry Pi
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Первым делом в программе подключим все необходимые библиотеки для управления контактами GPIO и работы с клиентом Adafruit MQTT.
1 2 3 |
import RPi.GPIO as GPIO import sys from Adafruit_IO import MQTTClient |
Далее установим режим работы с контактами GPIO, дадим осмысленное имя используемому контакту и сконфигурируем его в качестве цифрового выхода.
1 2 3 4 |
GPIO.setmode(GPIO.BOARD) GPIO.setwarnings(False) ledPin = 12 GPIO.setup(ledPin, GPIO.OUT) |
Затем укажем в программе свои AIO key (ключ) и Username (имя пользователя), которые мы раньше получили в панели инструментов Adafruit.
1 2 |
ADAFRUIT_IO_KEY = 'YOUR_AIO_KEY' ADAFRUIT_IO_USERNAME = 'YOUR_AIO_USERNAME' |
Далее укажем идентификатор используемого нами фида (FEED_ID), через который мы будем управлять включением и выключением светодиода. В данном случае мы используем фид с именем “light”.
1 |
FEED_ID = 'light' |
Затем запрограммируем функцию, которая будет вызываться при наступлении определенного события. В этой функции мы будем подписываться (subscribe) на фид (Feed) с помощью функции client.subscribe(FEED_ID).
1 2 3 |
def connected(client): client.subscribe(FEED_ID) print('Waiting for feed data...') |
После подписки на фид мы будем проверять поступление нового значения и сохранять его в переменной payload. Если значение переменной payload будет равно “1”, то мы будем включать свет лампы, а если оно будет равно “0” – мы будем выключать свет лампы.
1 2 3 4 5 6 |
def message(client, feed_id, payload): print('Feed {0} received new value: {1}'.format(feed_id, payload)) if payload == 1: GPIO.output(ledPin, GPIO.HIGH) else: GPIO.output(ledPin, GPIO.LOW) |
После этого мы создадим MQTT клиент чтобы с его помощью соединяться с платформой Adafruit IO, передавать и принимать от нее сообщения.
1 2 3 |
client = MQTTClient(ADAFRUIT_IO_USERNAME, ADAFRUIT_IO_KEY) client.on_connect = connected client.on_disconnect = disconnected |
После написания всего текста программы (приведен в конце статьи) сохраните ее с помощью ctrl+x и последующим нажатием enter. После этого нам нужно запустить нашу программу на выполнение.
1 |
python subscribe.py |
После запуска программы на выполнение вы увидите в окне терминала надпись "Waiting For Feed Data" (ожидание данных фида) как показано на рисунке ниже.
После этого убедитесь в том, что модуль реле подключен к плате Raspberry Pi, затем перейдите в панель инструментов (dashboard) Adafruit IO и изменяйте там наш фид для управления светом лампы (light feed). При приеме “1” лампа должна загораться, а при приеме “0” – гаснуть.
С помощью подобной системы вы можете управлять любыми своими домашними устройствами, находясь в любой точке земного шара, где есть доступ в сеть Интернет.
Исходный код программы на Python
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 |
import RPi.GPIO as GPIO import sys from Adafruit_IO import MQTTClient GPIO.setmode(GPIO.BOARD) GPIO.setwarnings(False) ledPin = 12 GPIO.setup(ledPin, GPIO.OUT) ADAFRUIT_IO_KEY = 'YOUR_AIO_KEY' ADAFRUIT_IO_USERNAME = 'YOUR_AIO_USERNAME' FEED_ID = 'light' def connected(client): # Subscribe to changes on a feed named Counter. (подписываемся на изменения в фиде) print('Subscribing to Feed {0}'.format(FEED_ID)) client.subscribe(FEED_ID) print('Waiting for feed data...') def disconnected(client): sys.exit(1) def message(client, feed_id, payload): print('Feed {0} received new value: {1}'.format(feed_id, payload)) if payload == 1: GPIO.output(ledPin, GPIO.HIGH) else: GPIO.output(ledPin, GPIO.LOW) # Create an MQTT client instance (создаем объект клиента MQTT) client = MQTTClient(ADAFRUIT_IO_USERNAME, ADAFRUIT_IO_KEY) # Setup the callback functions defined above. client.on_connect = connected client.on_disconnect = disconnected client.on_message = message # Connect to the Adafruit IO server. (соединение с сервером Adafruit IO) client.connect() client.loop_blocking() |