Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Система управления умным домом на основе Raspberry Pi

Оригинал: Home Automation with Raspberry Pi
Автор: Bharath Lohray
Дата публикации: 8 июля 2015 г.
Перевод: А. Панин
Дата перевода: 28 июля 2015 г.

Система управления умным домом на основе Raspberry Pi

Проект Raspberry Pi снискал особую популярность среди энтузиастов и преподавателей сразу же после запуска производства в 2011 году. Raspberry Pi является одноплатным компьютером размером с кредитную карту на основе SoC Broadcom BCM 2835 с оперативной памятью объемом от 256 до 512 МБ, портами USB, разъемом с выводами GPIO, портом Ethernet, выходом HDMI, разъемом для подключения камеры и слотом для карты памяти формата SD. Наиболее привлекательными характеристиками компьютера Raspberry Pi являются его низкая цена, равная 35 долларам США, и огромное сообщество разработчиков и пользователей.

Для Raspberry Pi подготовлены образы операционных систем с различными приложениями (http://www.raspberrypi.org/downloads), такие, как образ операционной системы Raspbian на основе дистрибутива Debian, образ операционной системы RASPBMC на основе мультимедийного центра XBMC (в данный момент известного как Kodi), образ операционной системы Plex Player на основе мультимедийного центра OpenELEC, образ операционной системы Ubuntu Core, образ операционной системы RISC OS и другие. Образ операционной системы NOOBS (New Out Of Box Setup) позволяет использовать удобное меню для выбора и установки любого из множества образов операционных систем с последующей их загрузкой. В процессе настройки образа операционной системы Raspbian используется язык Wolfram.

С момента начала производства в феврале 2011 года схемотехника компьютера Raspberry Pi пересматривалась четыре раза, причем каждый этап улучшений позволял поддерживать неизменной цену продукта, равную 35 долларам США. Последняя ревизия Raspberry Pi (Raspberry Pi 2) основана на четырехядерном процессоре cortex A7 с тактовой частотой в 900 МГц и использует 1 ГБ оперативной памяти. Более того, компания Microsoft анонсировала возможность бесплатной загрузки операционной системы Windows 10 для Raspberry Pi 2 в рамках программы IoT для разработчиков программного обеспечения (https://dev.windows.com/en-us/featured/raspberrypi2support). Данное обстоятельство, а также расширенные возможности новой ревизии, заставило таких фанатов данного компьютера, как я, перейти к использованию Raspberry Pi 2. Имея в распоряжении несколько новых плат Raspberry Pi 2, я задумался над тем, для каких целей я мог бы использовать платы более старых ревизий.

В данной статье я кратко опишу требования, предъявляемые к разрабатываемому мной проекту, а также различные инструменты, которые я выбрал для его реализации. После этого я опишу выбранное для реализации проекта аппаратное обеспечение и способ соединения отдельных аппаратных компонентов в процессе реализации аппаратной части системы. Далее я продолжу описание процесса создания окружения для разработки на основе образа операционной системы Raspbian, прокомментирую разработанный код и объединю все компоненты для реализации полноценной системы. Наконец, я подведу итоги и перечислю возможные оптимизации и приемы, которые позволят повысить пользовательские качества системы управления умным домом на основе Raspberry Pi.

Интернет вещей

Текущим трендом разработки встраиваемых устройств является подключение всех этих устройств к сети Интернет. Сеть Интернет разрабатывалась с учетом возможных сбоев и может корректно функционировать в случае выхода из строя нескольких узлов. Концепция Интернета вещей (The Internet of Things, IoT) предусматривает аналогичную избыточность. После окончания продолжающейся в данный момент миграции систем на протокол IPv6, пространство IP-адресов будет достаточно емким для обслуживания соединений нескольких триллионов устройств. Кроме того, в случае соединения устройства с сетью будет удобно управлять этим устройством из любой точки мира, принимая данные от различных сенсоров и отвечая на события. Совокупность соединенных с Интернетом вещей домашних устройств может выступать в роли живого существа, реагирующего на раздражители.

Система управления умным домом на основе Raspberry Pi

Вдохновленный идеей обеспечения собственной жизни умного дома, я начал работу над проектом системы управления освещением в гостиной своего дома. Цель данного проекта заключалась в создании системы, позволяющей осуществлять установку таймеров для отключения освещения в гостиной дома с возможностью управления этой системой посредством сети Интернет с помощью веб-браузера. Также я хотел реализовать API, который мог бы использоваться впоследствии для программного управления режимом работы устройства со стороны других устройств.

Интересным аспектом данного проекта является не аппаратное обеспечение, которое является достаточно простым в обращении и монтаже, а программное обеспечение, в частности, пользовательский интерфейс. Мне хотелось реализовать пользовательский интерфейс с поддержкой механизма одновременного входа в систему на основе компьютера Raspberry Pi множества пользователей. Пользовательский интерфейс должен был отражать текущее состояние системы в реальном времени, указывая на то, какие осветительные приборы в данный момент включены, причем множество пользователей должно иметь возможность одновременной работы с системой. Кроме того, осветительные приборы должны включаться или выключаться в соответствии с таймером. Сценарии пользовательского интерфейса, исполняющиеся в веб-браузере мобильного телефона или планшета, могут работать в условиях случайных разрывов соединений с сервером. Исходя из этого, данные сценарии должны корректно обрабатывать разрывы соединений и пытаться повторно подключиться к серверу на основе Raspberry Pi.

Аппаратное обеспечение

Сформировав список требований к системе, я начал подбор аппаратного обеспечения. В Таблице 1 приведен список приборов и материалов, которые были использованы мной для реализации аппаратной части системы, а на Рисунке 1 показана блочная диаграмма аппаратной части системы.

Таблица 1. Приборы и материалы

Компонент Количество Средняя цена Приобретено в Назначение
Raspberry Pi 1 $35 Newark Центральный сервер
Карта формата SD 1 $25 amazon.com Загрузка RPi
Модуль Edimax WiFi 1 $10 amazon.com Организация беспроводного соединения с RPi
Модуль реле 1 $10 amazon.com Переключение нагрузки
Гибкий кабель 1 $7 amazon.com Соединение разъема RPi с модулем реле
Блок питания 1 $8 amazon.com Питание RPi и модуля реле
Удлинитель 9 $54 Walmart Подвод питания к блоку питания и соединение с модулем реле
Пенал 1 $2 Walmart Корпус для аппаратной части системы
Кабель USB 1 $5 amazon.com Подвод питания к RPi
Провод диаметра 14 1 $6 Home Depot Соединение модуля реле с розеткой
Зажим для кабеля 1 $2 Home Depot Ограничение натяжения кабелей

Блочная диаграмма аппаратной части системы

Рисунок 1. Блочная диаграмма аппаратной части системы

Описание процесса монтажа аппаратной части системы занимает много времени, но является достаточно простым. В первую очередь следует соединить блок питания с стенной розеткой с помощью удлинителя, отрезав розетку это удлинителя. Зачистите провода и закрепите их с помощью винтов в терминалах блока питания. Далее соедините Raspberry Pi с блоком питания, отрезав разъем типа A от кабеля USB и соединив провода с соответствующими выводами блока питания, и вставьте разъем micro USB в разъем питания RPi. После этого следует зачистить оба конца двух жил гибкого кабеля и соединить их с соответствующими терминалами с обозначениями GND и JDVcc блока питания и блока реле. Наконец, следует удалить джампер, соединяющий вывод с обозначением JDVcc с выводом с обозначением Vcc. В том случае, если вы не удалите этот дампер, на предназначенные для напряжения 3.3 В выводы RPi будет подано напряжение в 5 В, которое с высокой вероятностью выведет компьютер из строя.

Теперь, когда питание подведено ко всем терминалам, следует соединить линии IN1-IN8 модуля реле с соответствующими выводами разъема GPIO с помощью гибкого кабеля таким образом, как показано на Рисунке 2. Представленный в данной статье код был разработан для случая, когда выводы IN1-IN7 соединены с выводами GPIO1-GPIO7. В том случае, если вы решите соединить данные выводы по-другому, вам придется модифицировать соответствующим образом ваш код.

Схема расположения выводов разъема GPIO Raspberry Pi приведена на Рисунке 2. На порты ввода-вывода Raspberry Pi подается напряжение 3.3 В, а модуль реле работает с напряжением 5 В. Однако, реле изолированы от выводов GPIO Raspberry Pi при помощи оптопар. На оптопары может подаваться напряжение 3.3 В с вывода Vcc. На вывод Vcc модуля реле может быть подано напряжение 3.3 В с разъема GPIO Raspberry Pi. Убедитесь в том, что вы убрали джампер, замыкающий выводы Vcc и JDVcc модуля реле. На вывод JDVcc должно подаваться напряжение 5 В для корректной работы реле. Рассматриваемый модуль реле размыкает контакты в активном состоянии. Из этого следует, что вы должны заземлить терминалы IN1-IN8 для включения реле.

Схема расположения выводов разъема GPIO Raspberry Pi

Рисунок 2. Схема расположения выводов разъема GPIO Raspberry Pi

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

Обрежьте остатки кабелей удлинителей с вилками и закрепите провода в соответствующих терминалах модуля реле. Также подключите провода кабеля, который впоследствии будет связывать систему со стенной розеткой, к соответствующим терминалам модуля реле. Вся аппаратная часть системы может быть размещена в пенале или аналогичном контейнере. Подумайте о корпусе заранее, чтобы по окончании работы над аппаратной частью системы избежать необходимости в отсоединении и повторном присоединении проводов к терминалам модуля реле. Кроме того, я вставил несколько закрепляемых с помощью винтов зажимов для кабелей в соответствующие отверстия корпуса для ограничения натяжения кабелей (Рисунок 3).

Монтаж аппаратной части системы

Рисунок 3. Монтаж аппаратной части системы

Программное окружение

Я начал создание своего программного окружения с установки образа операционной системы Raspbian. Перед началом установки образа операционной системы вам потребуется подготовить дисплей, поддерживающий передачу изображения по HDMI, клавиатуру и мышь с разъемами USB, а также сетевой кабель для соединения с системой по протоколу Ethernet. Также вы можете установить соединение с системой посредством адаптера Wi-Fi. Создайте загрузочную SD-карту для первой загрузки системы в соответствии с инструкциями, приведенными на ресурсе http://www.raspberrypi.org/documentation/installation/installing-image. В процессе первой загрузки системы установщик осуществит настройку операционной системы и разместит данные из ее образа на всем доступном пространстве карты памяти. После первой загрузки вы должны иметь возможность входа в систему с помощью стандартных данных учетной записи пользователя (имя пользователя "pi" и пароль "raspberry").

Обновление системы является разумным действием, которое должно выполняться сразу же после успешного входа в систему. Образ операционной системы Raspbian базируется на пакетах программного обеспечения дистрибутива Debian и использует приложение aptitude в качестве менеджера пакетов программного обеспечения. Кроме того, вам понадобятся пакеты программного обеспечения с именами python, pip и git. Я также мог бы порекомендовать установку Webmin для упрощения процесса администрирования системы. Инструкции по установке Webmin приведены на ресурсе http://www.webmin.com/deb.html (следуйте рекомендациям, приведенным в разделе "Using the Webmin APT repository"):

sudo apt-get update && sudo apt-get dist-upgrade
sudo apt-get install python python-pip git git-core

После этого вам придется настроить соединение с использованием адаптера Wi-Fi. Вы можете найти подробные инструкции на ресурсе http://www.raspberrypi.org/documentation/configuration/wireless. Я рекомендую использовать вариант wicd-curses. На данном этапе вы можете изменить параметры настройки Raspberry Pi с помощью команды sudo raspi-config. После ввода данной команды вы получите доступ к удобному графическому интерфейсу, который позволит вам установить значения таких параметров, как объем оперативной памяти, разделяемой с графическим процессором, параметры быстродействия центрального процессора, режим использования графического интерфейса в процессе загрузки и других.

Другим полезным инструментом является интегрированная среда разработки Cloud 9 IDE. Cloud 9 IDE позволит вам редактировать свой код на уровне Raspberry Pi посредством веб-браузера. Данная интегрированная среда разработки также предоставит вам доступ к интерфейсу командной строки в рамках веб-браузера. Вы можете разрабатывать и исполнять любой код, не покидая свой веб-браузер. Интегрированная среда разработки Colud 9 IDE требует наличия определенной версии фреймворка NodeJS. Использование неподдерживаемой версии фреймворка повлечет за собой постоянные аварийные завершения работы сервера Cloud 9, которые могут привести любого пользователя в уныние. Инструкции по установке фреймворка NodeJS на компьютер Raspberry Pi приведены на ресурсе http://weworkweplay.com/play/raspberry-pi-nodejs.

Программное обеспечение

Я решил создавать пользовательский интерфейс своей системы с использованием технологий HTML5, CSS3 и JavaScript. Комбинация трех упомянутых технологий является мощным инструментом для создания пользовательских интерфейсов. Язык программирования JavaScript позволяет использовать простой API для взаимодействия с серверами. Кроме того, существует множество библиотек для языка программирования JavaScript, таких, как JQuery, Bootstrap и других, из которых можно выбрать наиболее подходящую. HTML5 предоставляет API WebSocket, позволяющее веб-браузеру поддерживать соединение в рабочем состоянии и осуществлять обмен данными посредством этого соединения. Это обстоятельство делает API WebSocket особенно полезным для реализации динамических приложений и приложений для потоковой передачи данных, таких, как игры и чаты. Каскадные таблицы стилей CSS полезны для стилизации различных элементов страницы HTML. В случае корректного использования они позволяют создавать динамические пользовательские интерфейсы путем изменения стилей элементов страниц при наступлении тех или иных событий. Для данного проекта я выбрал фреймворк JQuery для обработки событий, Bootstrap CSS для размещения кнопок в форме сетки и язык программирования JavaScript для реализации механизмов обмена данными на основе API WebSocket.

Библиотеки

Серверное приложение, работающее на уровне Raspberry Pi, должно управлять состоянием выводов разъема GPIO платы Raspberry Pi. Оно также должно предоставлять интерфейс HTTP для передачи данных графического интерфейса и интерфейс WebSocket для передачи сообщений с командами и данными состояния. Готового к установке серверного приложения с такими специфическими функциями попросту не существует, поэтому я принял решение о создании своей собственной реализации сервера с использованием языка программирования Python. Для упрощения разработки описанного серверного приложения с использованием языка программирования Python доступны модули с реализациями методов для работы с интерфейсом GPIO Raspberry Pi, для создания сервера HTTP и для работы с интерфейсом WebSockets. Так как все перечисленные модули предназначены для выполнения поставленных задач, мне пришлось разработать минимальный объем кода.

Однако, упомянутые модули не включены в комплект поставки интерпретатора Python и должны устанавливаться отдельно. В первую очередь вам понадобится модуль для управления состоянием выводов разъема GPIO Raspberry Pi. Простейший способ изменения состояния выводов данного разъема заключается в использовании библиотеки RPi.GPIO, доступной по адресу https://pypi.python.org/pypi/RPi.GPIO. Вы можете установить соответствующий модуль с помощью следующей команды:

sudo pip install RPi.GPIO

Работа с модулем RPi.GPIO не связана с какими-либо сложностями. Вы можете найти примеры использования данного модуля по адресу http://sourceforge.net/p/raspberry-gpio-python/wiki/Examples. На первом шаге работы с модулем необходимо осуществить импорт его кода в код проекта. После этого вам придется выбрать режим работы. В качестве идентификатора режима работы может использоваться либо константа GPIO.BOARD, либо константа GPIO.BCM. Выбор режима работы обуславливает использование чипа BCM или выводов разъема ввода-вывода при ссылках на номера выводов во всех последующих командах. Далее следует указать, используются ли выводы из рассматриваемого разъема для ввода или вывода. Теперь вы можете использовать выводы данного разъема по назначению. Наконец, вам придется осуществить вызов метода cleanup() для сброса состояния выводов разъема GPIO. В Листинге 1 показан простейший пример использования модуля RPi.GPIO.

Листинг 1. Использование модуля RPi.GPIO

import RPi.GPIO as GPIO          # импортирование кода модуля в код проекта
GPIO.setmode(GPIO.BOARD)         # указание на то, что нумерация используется для обозначения выводов разъема
GPIO.setup(0, GPIO.IN)           # указание на то, что канал 0 будет использоваться для ввода
GPIO.setup(1, GPIO.OUT)          # указание на то, что канал 1 будет использоваться для вывода
var1=GPIO.input(0)                       # чтение состояния канала 0
GPIO.output(1, GPIO.HIGH)        # установка логической единицы на канале 1
GPIO.cleanup()                           # сброс состояния выводов разъема GPIO.

CherryPy является модульным веб-фреймворком для языка программирования Python. Возможности данного фреймворка легко расширяются до поддержки протокола WebSocket с помощью модуля ws4py. Модули CherryPy и ws4py также могут быть установлены с помощью инструмента pip:

pip install cherrypy
pip install ws4py

Примеры использования фреймворка CherryPy и плагина ws4py приведены в разделах с документацией фреймворка CherryPy и модуля ws4py соответственно. Для создания простейшего сервера на основе фреймворка CherryPy может использоваться код, приведенный в Листинге 2.

Листинг 2. Код простейшего сервера на основе фреймворка CherryPy

# Код взят из документации фреймворка CherryPy, доступной по адресу
# https://cherrypy.readthedocs.org/en/latest/tutorials.html

import cherrypy    # импорт кода модуля cherrypy в код проекта

class HelloWorld(object):      #
    @cherrypy.expose           # Предоставление доступа к функции обработки запросов
    def index(self):           # Создание функции для обработки всех запросов
        return "Hello world!"  # Возвращаемое значение будет передаваться веб-браузеру

if __name__ == '__main__':
   cherrypy.quickstart(HelloWorld())    # запуск сервера CherryPy 
                                        # и передача указателя на соответствующий экземпляр класса
                                        # для последующей обработки поступающих запросов

В более сложном коде в качестве параметра метода quickstart может передаваться указатель на экземпляр класса с параметрами конфигурации. Данный подход проиллюстрирован с помощью фрагмента кода из Листинга 3. Приведенный код обслуживает запросы к подресурсу /js, работая с файлами из поддиректории js. Поддиректория js расположена в директории с исходным кодом разрабатываемого сервера.

Листинг 3. Передача параметра метода quickstart

cherrypy.quickstart(HelloWorld(), '', config={
   '/js': {          # Описание методики обслуживания запросов к подресурсу /js
   'tools.staticdir.on': True,     # Следует работать с данными статических файлов
                                   # из заданной ниже рабочей директории подресурса
   'tools.staticdir.dir': 'js'     # Рабочая директория подресурса, являющаяся поддиректорией 
                                   # рабочей директории сервера.
   }
});

Для добавления поддержки протокола WebSocket в сервер на основе фреймворка CherryPy следует модифицировать код таким же образом, как показано в Листинге 4. В рамках класса обработчика запросов протокола WebSocket должны быть реализованы три метода: opened, closed и received_message. В Листинге 4 приведен код простейшего сервера с поддержкой протокола WebSocket, который был максимально сокращен с целью объяснения назначения его основных функциональных частей; исходя из вышесказанного, данный код на самом деле не выполняет никакой полезной работы.

Листинг 4. Простейший сервер с поддержкой протокола WebSocket

import cherrypy                 # Импортирование кода модуля сервера CherryPy в код проекта
# Импортирование кода модулей плагинов CherryPy в код проекта
from ws4py.server.cherrypyserver  import WebSocketPlugin, WebSocketTool
from ws4py.websocket import WebSocket   # Импортирование кода модулей 
                                        # плагина ws4py.
from ws4py.messaging import TextMessage

class ChatWebSocketHandler(WebSocket):
        def received_message(self, m):
                msg=m.data.decode("utf-8")
                print msg
                cherrypy.engine.publish('websocket-broadcast', 
                  "Широковещательное сообщение: принято")

        def closed(self, code, reason="Клиент покинул интерфейс 
          без корректного описания причины."):
                cherrypy.engine.publish('websocket-broadcast', 
                  TextMessage(reason))

class Root(object):
    @cherrypy.expose
    def index(self):
        return "index"

    @cherrypy.expose
    def ws(self):
        print "Обработчик создан: %s" % repr(cherrypy.request.ws_handler)


if __name__ == '__main__':
    WebSocketPlugin(cherrypy.engine).subscribe()   # инициализация плагина
                                                   # для поддержки протокола WebSocket
    cherrypy.tools.websocket = WebSocketTool()          #
    cherrypy.config.update({'server.socket_host': '0.0.0.0',
        'server.socket_port': 9003,
        'tools.staticdir.root': '/home/pi'})
    cherrypy.quickstart(Root(), '', config={
             '/ws': {
                     'tools.websocket.on': True,
                     'tools.websocket.handler_cls': ChatWebSocketHandler
               }
        });

На стороне клиента сценарии страницы HTML должны реализовывать функцию для соединения с сервером по протоколу WebSocket и обработки входящих сообщений. В Листинге 5 показан код простой страницы HTML со сценарием, реализующим данную функцию. В этом коде событие jQuery.ready() используется для инициирования соединения с сервером по протоколу WebSocket. Сценарий из данного листинга реализует методы для обработки всех событий: onopen(), onclose(), onerror() и onmessage(). Для расширения возможностей данного сценария в него следует добавить реализацию метода onmessage(), предназначенного для обработки входящих сообщений.

Листинг 5. Код страницы со сценарием для соединения с сервером по протоколу WebSocket и обработки входящих сообщений

<html>
    <head></head>
    <body>

    <script src="/js/jquery.min.js"></script>
    <script type="text/javascript">
    var ws;
    var addr="ws://127.0.0.1:9000";
    $(document).ready(function (){
            connectWS();
    });
    function dbg(m){
            console.log(m);
    }
    function connectWS(){
            dbg('Соединение...');
            if (window.WebSocket) {
                    ws = new WebSocket(addr);
            }
            else if (window.MozWebSocket) {
                    ws = MozWebSocket(addr);
            }
            else {
                    alert('Ваш архаичный веб-браузер не поддерживает протокол
                      WebSocket.');
                    dbg('Протокол WebSocket не поддерживается');
                    return;
            }

            /* событие закрытия соединения */
            ws.onclose=function(){
                    dbg('Соединение закрыто.');
                    reconnect=setTimeout(connectWS,6000); //попытка 
                                                          //установки повторного соединения
                                                          //через каждые 6 секунд.
            }

            /* событие установки соединения */
            ws.onopen=function(){
                    dbg('Соединение установлено.');
                    ws.send('Сообщение, отправленное серверу 
                      по протоколу WebSocket.');
            }

            /* событие ошибки сокета */
            ws.onerror=function(e){
                    dbg("Ошибка сокета: " + e.data);
            }

            /* событие приема сообщения */
            ws.onmessage = function (evt) {
                    dbg(evt.data);
                    //здесь следует добавить код для обработки входящих сообщений.
            }
            return 0;
    }
    </script>
    </body>
</html>

Система управления умным домом

Теперь, когда вы ознакомились с основными аспектами реализации приложений на основе протокола WebSocket, фреймворка CherryPy, а также с методикой создания сценариев для страниц HTML, давайте обратимся к коду рассматриваемого проекта. Вы можете получить исходный код программной части проекта из репозитория Git по адресу https://bitbucket.org/lordloh/pi-home-automation. В процессе работы с вашим компьютером RaspberryPi вы можете осуществить локальное клонирование данного репозитория и инициировать исполнение серверного приложения с помощью следующих команд:

git clone https://bitbucket.org/lordloh/pi-home-automation.git
git fetch && git checkout LinuxJournal2015May
cd pi-home-automation
python relay.py

Файл relayLabel.json содержит необходимые данные конфигурации, такие, как названия реле, значения таймеров для включения и отключения освещения и другие. В Листинге 6 показана базовая схема конфигурации программной части системы. Приведенный шаблон должен повторяться для каждого из реле. Значение свойства dow формируется побитово для каждого из дней недели начиная с младшего двоичного разряда для понедельника и заканчивая старшим двоичным разрядом для воскресенья.

Листинг 6. Базовая схема конфигурации программной части системы

{
  "relay1": {
    "times": [
      {
        "start": [
          <часы>,
          <минуты>,
          <секунды>
        ],
        "end": [
          <часы>,
          <минуты>,
          <секунды>
        ],
        "dow":
<Понедельник<<0|Вторник<<1|Среда<<2|Четверг<<3|
 Пятница<<4|Суббота<<5|Воскресенье<<6>
      }
    ],
    "id": 1,
    "label": "<Название устройства>"
  }
}

На Рисунке 4 показана блочная диаграмма системы с указанием на ее основные функциональные части. В Таблице 2 перечислены все команды, которые клиент может отправить серверу, а также действия, которые сервер должен будет выполнять при их получении. Данные команды передаются от браузера серверу в формате JSON. Для команд используется следующая схема:

{
    "c":"<команда из Таблицы 2>",
    "r":<реле Номер>
}

Команды update и updateLabels не принимают номера реле. Помимо файлов relay.py и relayLabel.json единственным необходимым для функционирования системы файлом является файл index.html. Сценарий relay.py осуществляет чтение данного файла и передает его в ответ на HTTP-запросы. Файл index.html содержит код HTML, CSS и JavaScript для формирования пользовательского интерфейса.

Блочная диаграмма системы

Рисунок 4. Блочная диаграмма системы

Таблица 2. Команды

Команда Описание
on Включение реле
off Выключение реле
update Передача состояния выводов разъема GPIO и названий реле
updateLabels Сохранение новых названий реле в файлах формата JSON

После настройки и запуска системы у вас наверняка возникнет желание получить доступ к ней посредством сети Интернет. Для этого вам придется установить постоянный MAC-адрес и зарезервировать IP-адрес в вашей локальной сети для Raspberry Pi, после чего настроить механизм преобразования номеров сетевых портов на уровне вашего маршрутизатора. Процесс выполнения данной последовательности действий значительно отличается в зависимости от используемого маршрутизатора, поэтому руководство по эксплуатации вашего маршрутизатора будет являться в данном случае лучшим руководством. Кроме того, вы можете использовать динамическую службу доменных имен для того, чтобы не вводить IP-адрес каждый раз при возникновении необходимости в доступе к вашему серверу на основе Raspberry Pi. Некоторые модели маршрутизаторов могут поддерживать механизм взаимодействия с определенными динамическими службами доменных имен.

Заключение

Я надеюсь, что данная статья поможет вам в реализации данного проекта или других аналогичных проектов. Данный проект может быть расширен с целью добавления новых возможностей, таких, как механизм установления факта соединения вашего мобильного телефона с сервером по протоколу Wi-Fi с последующим включением осветительных приборов. Также вы можете интегрировать описанную систему с такими приложениями, как OnX и Android Tasker. Добавление механизма ограничения доступа к графическому интерфейсу системы на основе паролей для клиентов, находящихся вне локальной сети, также является полезным. Не стесняйтесь сообщать мне о любых недоработках, ошибках и необходимых возможностях системы посредством ресурса http://code.lohray.com/pi-home-automation/issues.