В этой статье мы продолжаем наш рассказ о построении системы «Умная дача» на основе устройств UNC0xx. Как обычно в таких случаях, наиболее трудоёмким, интеллектоёмким и одним из самых ресурсоёмких (в широком смысле) оказался вопрос с программным обеспечением — впрочем, если вы решите пойти тем же путём, что и мы, вам будет гораздо проще: у вас уже будет ПО, которое нам пришлось написать с нуля. Программу FFazenda, которая была создана в ходе разработки нашей «Умной дачи», мы готовы предоставить всем желающим не просто бесплатно, но — кто в курсе, тот поймёт — на условиях свободной лицензии GNU GPL 3.0, в том числе и в виде архива исходных текстов.
Но — обо всём по порядку. Проблемы, которые стояли перед нами, достаточно легко перечислить. Кто-то в нашей системе должен был:
- работать с устройствами UNC0xx, то есть опрашивать их на предмет изменения состояний входных линий, считывать показания датчиков температуры и выдавать при необходимости команды на коммутацию управляемых цепей (включение и выключение реле);
- принимать и отправлять SMS-сообщения;
- поддерживать Web-интерфейс;
- отслеживать текущее состояние системы, принимать (на основе поступающей информации и команд) решения о смене состояний, о выполнении активных действий, а также при необходимости — об отправке сообщений хозяевам.
Последний пункт явно указывал на необходимость программирования, но первая мысль, которая приходит в голову при виде подобной задачи — это написать десяток небольших скриптов, хоть на Perl'е, хоть на Python'е, да хоть бы и на Bash'е. Быстро, дёшево, сердито. Для работы с UNC0xx использовать утилиту uncctl
, SMS отправлять и получать через SMSTools, для web-интерфейса поставить какой-нибудь Apache или новомодный Nginx, и вроде бы всё должно получиться.
При более вдумчивом анализе с учётом печального опыта некоторых старых проектов ситуация начинает выглядеть не столь однозначно. Во-первых, командно-скриптовые языки, давая очевидный выигрыш на крохотных программах в десяток строк, при этом оказываются неудобны и создают множество проблем при попытке реализовать на них что-то достаточно сложное — а ведь логика работы нашей системы намечалась довольно нетривиальная, и это было видно с самого начала. Но основная проблема даже не в этом. Веб-интерфейс, построенный под веб-сервером общего назначения, неизбежно разбухает в целую систему скриптов, которые уже на ранних стадиях разработки начинают напоминать нечто из верёвочек и противовесов, да и сам веб-сервер, будучи программой довольно сложной, требует нетривиальной настройки. Всё это вместе навевает ассоциации с использованием камаза для перевозки одной табуретки. Основной недостаток таких избыточных решений состоит в их практически заведомой неотчуждаемости — чтобы повторить конфигурацию на новой машине, нужно выполнить нетривиальный набор действий, и сделать их может обычно только автор исходной системы.
По итогам анализа задачи было принято решение написать единую управляющую программу, включающую реализацию логики работы с устройствами UNC0xx, а также собственный веб-сервер, причём сделать это решили на компилируемом языке, чтобы иметь возможность, помимо прочих способов распространения, отдавать пользователям статически собранный исполняемый файл, не требующий инсталляции. Современный ассортимент чисто компилируемых языков программирования оказывается на удивление беден — практически это только Си и Си++, остальные либо де-факто умерли, как Паскаль, либо настолько экзотичны, что оказывается сложно найти программиста, такой язык знающего. Но и с Си и его «плюсовым» наследником дела обстоят весьма непросто. Чистый Си слишком беден для развесистых прикладных задач, работа на нём — удел сильных духом. Что же касается современного состояния Си++, то большинство программистов, использующих этот язык, воспринимает его не иначе как в связке с библиотекой STL, а результатом становится код, во-первых, безумно неэффективный (чему-чему, а уж эффективности использование «универсальных» контейнеров не способствует абсолютно), и, во-вторых, код в большинстве случаев получается «одноразовый» — его проще переписать заново, нежели пытаться что-то в нём изменить или исправить: даже автор часто не может разобраться в собственном коде двух-трёхмесячной давности. Наш итоговый выбор — подмножество Си++, не включающее никакие средства из его стандартной библиотеки, а также часть возможностей самого языка, таких как множественное наследование, идентификация типов во время исполнения и ещё некоторые экзотические средства. Если бы наше приложение было критично по скорости исполнения, мы отказались бы ещё и от обработки исключений, но в случае данного конкретного проекта в этом не было нужды.
Ещё одно непростое решение состояло в выборе способа работы с SMS-сообщениями, точнее — с GSM-модемами. Здесь мы выбрали подход, прямо противоположный выбранному с web-интерфейсом: работу с GSM-модемами мы возложили на пакет SMSTools. С одной стороны, этот пакет настраивается довольно просто — достаточно прописать в его конфигурационном файле имя порта, к которому подключён модем; с другой стороны, SMSTools берёт на себя все трудности, связанные с различием командных систем разных моделей модемов, что, в общем, немало. Взаимодействие с SMSTools осуществляется на удивление просто: полученные сообщения он складывает в определённую директорию в виде отдельных файлов, и их оттуда можно забрать обычным переименованием файла, а чтобы отправить через него сообщение, достаточно поместить его (опять же, в виде простого текстового файла) в другую директорию. Наконец, что немаловажно, SMSTools входит в большинство дистрибутивов Linux в виде готового пакета, так что серьёзных сложностей с ним вроде бы можно не ждать.
По итогам принятых решений была создана программа FFazenda, на домашней странице которой вы можете скачать архив её исходных текстов, монолитный статически собранный исполняемый файл для Linux/i386, а также подробное руководство по эксплуатации на русском языке.
Основные возможности программы FFazenda:
- гибкое описание логики работы системы домашней автоматизации в терминах конечных автоматов и событий;
- отслеживание показаний температурных датчиков;
- приём и отправка SMS-сообщений (управление и оповещение через SMS);
- локальное управление через Web-интерфейс;
- локальное управление через консольный порт (telnet);
- описание пользовательских команд;
- взаимодействие с другими системами через запуск внешних команд и
анализ внешних источников событий.
В настоящее время существует только версия программы для ОС Linux, работа которой проверяется на обычных PC-совместимых компьютерах, а также на Raspberry~Pi. Имеются основания предполагать, что программа будет работать также в других операционных системах семейства Unix, таких как FreeBSD. Программа распространяется в виде архива исходных текстов на языке Си++, поставляется бесплатно под лицензией GNU GPL v.3. В будущем возможен выпуск версии программы для Windows, если будет обнаружен спрос на такую версию; отметим на всякий случай, что использование Windows на компьютере, управляющем домашней автоматикой (и, как следствие, постоянно включённом), на наш взгляд, является идеей неудачной, как и вообще использование в этой роли компьютера общего назначения (например, настольного).
Конфигурационный файл программы FFazenda позволяет задавать нетривиальную логику работы системы в терминах конечных автоматов, каждый из которых в любой момент времени находится в одном из предопределённых состояний. Переход из состояния в состояние происходит при возникновении события, в качестве таковых могут рассматриваться замыкание и размыкание входных линий устройств UNC0xx (к входным линиям можно подсоединить датчики движения, открытия/закрытия дверей и окон, а также простые кнопки и тумблеры), переход показаний температуры, считываемых с температурных датчиков, через заданные границы, а также поданные извне команды. Подробности можно найти в руководстве по эксплуатации, там же рассмотрены примеры.
Отметим, что услуги по подбору оборудования для системы «Умный дом/умная дача», настройке соответствующего программного обеспечения и прочим пусконаладочным работам вы можете при желании заказать у нас.
Ключевые слова/keywords: умный дом open source, умная дача open source, бюджетный умный дом, умный дом своими руками, умная дача своими руками, компьютерное управление домом, охранная система своими руками, дистанционное включение отопления, дистанционный мониторинг температуры, управление по SMS, умный дом для программиста