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

Система очень простая, она позволяет управлять по сети (внешней или локальной) пинами GPIO настроенными на выход и получать их статус (то есть видеть, что включено-выключено) . Отправлять какие-либо команды, которые можно обрабатывать внутри Raspberry. Получать состояние пинов GPIO (в виде 0 или 1) настроенных на вход. Конструктор сам настроет нужные вам пины GPIO на вход или на выход.

Если нужна более гибкая система, то лучше воспользоваться предыдущей .

Пользователю нужно только лишь собрать интерфейс в конструкторе, скачать архив с файлами и рапаковать его на своём RaspberryPi 2 .
В архиве будут лежать готовые файлы относящихся к веб-части (html, css, js) , sh-скрипт для инициализации пинов и сервер для обмена данными Home stD Rp . Установка каких-либо дополнительных программ не требуется.

Несмотря на, может быть, покажущуюся сложность, все очень просто и займёт минут 10-15.

Внешний вид

Ознакомительная часть.

Как уже говорилось в предыдущей , идея web-интерфейса достаточно проста и в чём-то даже аскетична. Связано это с тем, что мне разонравились нарисованные комнаты с лампочками и прочие полумеры, поэтому выбран стиль «пульта от телевизора».

Работает на любом устройстве - компьютере, ноутбуке, планшете, мобильнике.


Главный экран интерфейса. Помещений может быть до пяти.

На основном экране расположены кнопки с названиями помещений, нажатие на которые открывает панель с органами управления соответствующим помещением.

Откроем прихожую:

Здесь могут располагаться: несколько кнопок настроенных на выход (BCM0 , BCM1 и т.д.) для включения чего-либо с возвратом статуса. То есть, если это что-то (например верхний свет) включено, то надпись подсветится.

Несколько кнопок (SENTSIG1 и т.д) для отправки любой команды в RaspberryPi.

И несколько полей (IN_BCM2 и т.д) для получения состояние пинов GPIO (в виде 0 или 1) настроенных на вход. 0 - пин подтянут к «земле», 1 - на пине есть напряжение.

В дальнейшем можно изменять названия кнопок и менять их местами.

рестик справа-сверху - закрытие панели.

Под кнопкой Info скрывается панель с информацией о статусе системы.

Надпись Connect! говорит о том, что всё хорошо, а Count update: - это просто счётчик запросов (браузер с интервалом в ~700мс запрашивает у ардуины данные) . Интервал можно менять.

Если произойдёт какая-то неполадка, тогда на экране появится сообщение ERROR , а в Info будет описана причина ошибки.

Весь алгоритм работы системы описан в конце статьи.

Конец ознакомительной части.

Конструктор

Коротенькое видео по работе с конструктором, можно посмотреть вот по этой ссылке .

«Умный дом» будет работать на любом устройстве, а вот конструировать надо на обычном компе или ноуте.

В браузере должны быть включены cookie. Впрочем они и так почти у всех включены.

Конструктор предельно прост и интуитивно понятен . Открыв в соседней вкладке вот , вы окажитесь на первой странице (всего их четыре) :

Чтоб понять и потренироваться, проделайте всё как написано ниже.

Здесь нужно выбрать количество помещений (максимум 5) . Предположим, что у нас будет два помещения (прихожая и кухня) , тогда выберите 2 и нажмите «Далее».

В «названии вашего умного дома» и «названиях помещений», можно использовать только буквы, цифры, пробел и нижнее_подчёркивание.

В дальнейшем Вы можете это исправить в файле index.html.

На следующей странице нужно придумать название вашего «умного дома» (это то, что будет написано на вкладке браузера) и вписать его в поле Название страницы .

В поля Адрес сервера и Порт сервера ничего писать не нужно (сделано на будущее) .

Названия помещений у нас уже придуманы (прихожая и кухня) , вписываем их и нажимаем кнопку «Далее»…

Здесь Вы увидите главный экран своего будущего интерфейса:

Нажмите на кнопку «Прихожая»…

Выберите две кнопки для включения чего-либо с возвратом статуса (Количество кнопок вкл/откл) .
Одну кнопку для отправки команды (Количество кнопок отправки сигнала) .
И одно поле для приёма статуса с каких-либо пинов (Количество полей для приёма информации) .

Максимум можно выбрать по пять кнопок.

Теперь закройте панель кнопкой , проделайте то же самое с «Кухней» и нажмите кнопку «Далее»…

Появится главный экран с кнопкой «Скачать архив»:

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

Внимание! У Raspbery Pi 2 всего 28 GPIO (BCM0 - BCM27). Если Вы в конструкторе сделаете больше 27 кнопок/полей приёма, то всем лишним BCM будет присваиваться номер 28 , а у лишних полей приёма IN_BCM значение будет просто увеличиваться. Функционировать они не будут.

Подключение
Соберём простенькую схему для испытания системы:

Подключите светодиод к пину BCM 1 , через резистор 500-1000 Ом. При нажатии в интерфейсе кнопки BCM1, светик будет загораться/гаснуть, а надпись менять цвет.

Так же подключите проводок через резистор 500-1000 Ом к BCM 3 , этим проводочком можно будет тыкать на +3.3 или Ground , и в поле IN_BCM3 нолик на единичку. Таким образом можно отслеживать какие-то события.

BCM 2 используйте только на выход . Если сделали как вход (IN_BCM2) , то не пользуйтесь им или переделайте как выход (BCM2) .

Применение кнопок SENTSIG описано ниже.

HomestDRp
Распаковав архив, у Вас появится папка - mydomrpXXXXXXXXXX , переименуйте её так, чтоб получилось mydomrp и перейдите в неё.

Переименуйте файлы indexXXXXXXXXX.html в index.html и initXXXXXXXXX.sh в init.sh .

В папке mydomrp получатся файлы index.html , init.sh , jquery.js и style.css и программа homestdrp .

Откройте файл index.html и в двенадцатой строчке - var flagobnov = 0 , переправьте нолик на единичку - var flagobnov = 1 (отключено в конструкторе). Сохраните файл.

Дополнительные пояснения к файлам, даны в конце статьи.

Теперь к программе homestdrp…

homestdrp - это web-сервер, который принимает запросы от клиента, передаёт команды RaspberryPi, считывает состояние пинов GPIO и отправляет обратно информацию/статус web-клиенту. Иными словами, его назначение - это обмен данными между web-клиентом (браузер) и RaspberryPi. Работает по протоколу ТСР, а в перспективе и по UDP.

Исходник

#include #include #include #include #include #include #include #include #include #include #include #include #include char response = "HTTP/1.1 200 OK\r\n" "Content-Type: text/html; charset=UTF-8\r\n\r\n"; char response_css = "HTTP/1.1 200 OK\r\n" "Content-Type: text/css; charset=UTF-8\r\n\r\n"; char response_js = "HTTP/1.1 200 OK\r\n" "Content-Type: text/js; charset=UTF-8\r\n\r\n"; char response_text = "HTTP/1.1 200 OK\r\n" "Content-Type: text/text; charset=UTF-8\r\n\r\n"; char response_403 = "HTTP/1.1 200 OK\r\n" "Content-Type: text/html; charset=UTF-8\r\n\r\n" "403" "" "

403

\r\n"; #define BUFSIZE 1024 #define ARRAY_SIZE 90000 #define BSIZ 512 char send1_array = {0,}; char send2_array = {0,}; char patch_to_dir = {0,}; char fpfile = {0,}; char buffer = {0,}; int count_simvol = 0; unsigned int PORTW = 0; int len_dat = 0; int count_warning_log =0; void error_log(char *my_error) { char file_error_log = {0,}; snprintf(file_error_log, 26, "%s", "/var/log/ErrorhomeRp.log"); time_t t; time(&t); FILE *f; f = fopen(file_error_log, "a"); if(f == NULL) { printf("Error open /var/log/ErrorhomeRp.log.\n"); exit(0); } fprintf(f, "%s", ctime(&t)); fprintf(f, "Error %s\n\n", my_error); printf("Error %s Write to /var/log/ErrorhomestdRp.log.\n", my_error); fclose(f); exit(0); } void warning_access_log(char *war_ac) { count_warning_log++; char file_Warning_Access_log = {0,}; snprintf(file_Warning_Access_log, 31, "%s", "/var/log/Warning_AccessRp.log"); if(count_warning_log > 100) { system("gzip -f /var/log/Warning_AccessRp.log"); count_warning_log =0; time_t t; time(&t); FILE *f; f = fopen(file_Warning_Access_log, "w"); fprintf(f, "%s", ctime(&t)); fprintf(f, "%s\n\n", war_ac); printf("Write to /var/log/Warning_AccessRp.log:\n%s\n", war_ac); fclose(f); } else { time_t t; time(&t); FILE *f; f = fopen(file_Warning_Access_log, "a"); fprintf(f, "%s", ctime(&t)); fprintf(f, "%s\n\n", war_ac); printf("Write to /var/log/Warning_AccessRp.log:\n%s\n", war_ac); fclose(f); } } void read_in_file(char *name_file) { count_simvol = 0; memset(send1_array, 0, ARRAY_SIZE * sizeof(char)); memset(fpfile, 0, 64 * sizeof(char)); snprintf(fpfile, (int)strlen(patch_to_dir) + (int)strlen(name_file) + 1, "%s%s", patch_to_dir, name_file); FILE *file; file = fopen(fpfile,"r"); if(file == NULL) error_log("open file."); int ch; while(ch = getc(file), ch != EOF) { send1_array = (char) ch; count_simvol++; if(count_simvol == ARRAY_SIZE - 2) break; } fclose(file); } int main(int argc, char *argv) { if(argc != 4) error_log("not argumets."); PORTW = strtoul(argv, NULL, 0); // порт для web-сервера 80 strncpy(patch_to_dir, argv, 63); // путь к папке len_dat = atoi(argv); // кол-во символов warning_access_log("START"); ////////////////////////////////////////////// WEB /////////////////////////////////////// int one = 1, client_fd; struct sockaddr_in svr_addr, cli_addr; socklen_t sin_len = sizeof(cli_addr); int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sock < 0) error_log("not socket."); setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(int)); svr_addr.sin_family = AF_INET; svr_addr.sin_addr.s_addr = INADDR_ANY; svr_addr.sin_port = htons(PORTW); if(bind(sock, (struct sockaddr *) &svr_addr, sizeof(svr_addr)) == -1) { close(sock); error_log("bind."); } if(listen(sock, 10) == -1) { close(sock); error_log("listen."); } ////////////////////////////////////////// work file ////////////////////////////////////////////////// char flin_fldb = {0,}; snprintf(flin_fldb, (int)strlen(patch_to_dir) + (int)strlen("init.sh 1 "), "%s%s", patch_to_dir, "init.sh 1"); system(flin_fldb); char bufRec = {0,}; char To_GPIO = {0,}; FILE *mf; char in_data = {0,}; char gp_file = {0,}; printf("Receive data from RPi\n\n"); for(;;) { client_fd = accept(sock, (struct sockaddr *) &cli_addr, &sin_len); if(client_fd == -1) continue; memset(buffer, 0, BUFSIZE * sizeof(char)); read(client_fd, buffer, BUFSIZE - 1); if((strstr(buffer, "file.db")) != NULL) { memset(in_data, 0, 256 * sizeof(char)); memset(bufRec, 0, BSIZ * sizeof(char)); int i = 0; int ip = 0; for(i = 0; i < len_dat; i++) { memset(gp_file, 0, 32 * sizeof(char)); snprintf(gp_file, 29, "%s%d%s", "/sys/class/gpio/gpio", i, "/value"); if(ip > 54) { in_data = "0"; ip++; in_data = " "; ip++; } else { mf = fopen (gp_file, "r"); if(mf == NULL) error_log("gpio, fail last argument."); in_data = getc(mf); ip++; in_data = " "; ip++; fclose (mf); } } printf("Data:%s\n", in_data); int len_ara = (int)strlen(in_data) + 59; snprintf(bufRec, len_ara, "%s%s", response_text, in_data); write(client_fd, bufRec, len_ara - 1); close(client_fd); } else if((strstr(buffer, "comanda")) != NULL) /////////// comand { memset(To_GPIO, 0, 64); snprintf(To_GPIO, (int)strlen(patch_to_dir) + (int)strlen("init.sh 0 ") + 4, "%sinit.sh 0 %c%c%c", patch_to_dir, buffer, buffer, buffer); system(To_GPIO); close(client_fd); warning_access_log(buffer); printf("To Gpio:%s\n", To_GPIO); } else if((strstr(buffer, "GET / ")) != NULL) { read_in_file("index.html"); int len_ara = count_simvol + (int)strlen(response) + 1; memset(send2_array, 0, len_ara * sizeof(char)); snprintf(send2_array, len_ara, "%s%s", response, send1_array); write(client_fd, send2_array, count_simvol + 59); close(client_fd); warning_access_log(buffer); printf("Trans index.html.\n\n"); } else if((strstr(buffer, "style.css")) != NULL) { read_in_file("style.css"); int len_ara = count_simvol + (int)strlen(response_css) + 1; memset(send2_array, 0, len_ara * sizeof(char)); snprintf(send2_array, len_ara, "%s%s", response_css, send1_array); write(client_fd, send2_array, count_simvol + 58); close(client_fd); warning_access_log(buffer); printf("Trans style.css.\n\n"); } else if((strstr(buffer, "jquery.js")) != NULL) { read_in_file("jquery.js"); int len_ara = count_simvol + (int)strlen(response_js) + 1; memset(send2_array, 0, len_ara * sizeof(char)); snprintf(send2_array, len_ara, "%s%s", response_js, send1_array); write(client_fd, send2_array, count_simvol + 57); close(client_fd); warning_access_log(buffer); printf("Trans jquery.js.\n\n"); } else { write(client_fd, response_403, sizeof(response_403) - 1); close(client_fd); warning_access_log(buffer); } } } //END main //gcc -Wall -Wextra -Werror homestdrp.c -o homestdrp

Теперь копируем папку mydomrp в любое удобное место на RaspberryPi, например в корень, - /mydomrp , делаем файлы homestdrp и init.sh исполняемым…

Sudo chmod +x /mydomrp/homestdrp sudo chmod +x /mydomrp/init.sh

И заспускаем программу с тремя параметрами:

Sudo /mydomrp/homestdrp 80 /mydomrp/ 6

Позже, для автоматизации запуска, добавите эту команду в файл rc.local

Nano /etc/rc.local

Вписать надо до строчки exit 0 , вот так:

... (/mydomrp/homestdrp 80 /mydomrp/ 6)& exit 0

О параметрах:

Первый параметр - TCP порт. Порт можно указать любой, однако если у Вас больше нет никаких серверов занимающих стандартный (80) порт, то укажите его, ну в ежели занят, то напишите что-нибудь другое, например 82 (заходить в «умный дом» будете так - адрес:82 ) .

Второй параметр - путь к папке /mydomrp/ (с обязательным слешом / в конце) .

Четвёртый параметр - количество данных посылаемых клиену (вдаваться в подробности этого пункта не стоит, по крайней мере сейчас) , подсмотреть эту цифру нужно в файле index.html в строке if(vars.length == 6) . В коде она находится вот здесь:

Show(); setInterval(show,680); function show(){ if(flagobnov == 1) { $.ajax({ type: "POST", url: "file.db", timeout:560, cache: false, success: function(data){ var vars = data.split(" "); if(vars.length == 6) ЭТА ЦИфРА { count_obnov++; ...

После успешного старта, homestdrp первым делом запускает скрипт init.sh (Start init.sh) , который вначале удаляет все ссылки на все GPIO, а потом создаёт нужные (Export selected pin) и задаёт им режимы (in/out) (Initialization selected pin) .


На ошибки - sh: echo: I/O error не обращайте внимания, так и должно быть. Ведь скрипт очищает GPIO которых и так нет.

Теперь открыв страничку в браузере, вы увидите в терминале различные сообщения и отправку считанных данных GPIO:

Все действия homestdrp , сопровождаются записью в файл /var/log/Warning_AccessRp.log , и туда же пишутся предупреждения.

В случае критической ошибки (например не дописать аргумент) , она будет записана в файл /var/log/ErrorhomestdRp.log и программа остановится.

Теперь, если остановить homestdrp (Ctrl + c), то интерфейс сообщит об ошибке:

Пояснения

Как пользоваться кнопкой SENTSIG x?

Открыв файл init.sh (из папки /mydomrp) , среди прочего, вы найдёте вот такие строки:

104) # reaction to the button SENTSIG1 ;; 109) # reaction to the button SENTSIG2 ;; ...

Вот сюда то (вместо # reaction to the button SENTSIG1) и нужно вписывать свои команды.
То есть, если вместо "# reaction to the button SENTSIG1" написать reboot (без #) , сохранить файл и нажать в интерфейсе кнопку SENTSIG1 , то малинка перезагрузится, или если вместо "# reaction to the button SENTSIG2" написать apt-get update && apt-get upgrade , то обновится.

В общем можно делать всё, что душе угодно.

Пояснения к файлу index.html

Для наглядности откройте файл сформированный конструктором.

SetInterval(show,680); ...

… получает ответ в текстовом виде (данные разделены пробелами) и раскладывает их по переменным.

... /* приём */ if(vars == 1) { $(".d2otkl").show(); $(".d2vkl").hide(); } else if(vars == 0) { $(".d2otkl").hide(); $(".d2vkl").show(); } $("#indata3").html("INDATA3" + " " + vars); if(vars == 1) { $(".d3otkl").show(); $(".d3vkl").hide(); } else if(vars == 0) { $(".d3otkl").hide(); $(".d3vkl").show(); } ...

Если Вы устанавливаете систему там, где качество связи оставляет желать лучшего (например на даче) , то есть пинги туда очень большие, то будут появлятся ошибки «timeout». Во избежание этого, нужно увеличить таймаут запроса:

Show(); setInterval(show,680); function show(){ if(flagobnov == 1) { $.ajax({ type: "POST", url: "file.db", timeout:560, /* эта цифра (в миллисекундах)*/ cache: false, ...

По умолчанию стоит 560мс, увеличивайте её с шагом в 100 мс и пробуйте. Соответственно нужно увеличивать и setInterval(show,680) , так же на 100 мс.

Изменять названия кнопок (D2, D3, SENTSIG1 и т.д.) можно здесь:

...

D2
D2
SENTSIG1
...

Изменять названия полей для приёма данных (IN_BCM3, IN_BCM5 и т.д.) можно здесь:

... $("#indata3").html("IN_BCM3" + " " + vars); ...

Браузер постоянно запрашивает данные и тем самым создаёт трафик. Чтобы этого избежать, можно либо закрыть страницу, либо раскомментировать этот блок:

/*slmode++; if(slmode > 70) { $(".pansl").show(300); flagobnov = 0; slmode = 0; }*/

Тогда через ~минуту, страница будет закрываться полупрозрачной панелью и обновления остановятся. Клик на панель, уберёт её и обновления возобновяться.

После внесения изменений в index.html обязательно обновите страничку в браузере .

Все вопросы и пожелания пишите в комментах!

На этом пока всё, в

В статье представлена информация о популярной линейке миникомпьютеров Raspberry pi. Описан принцип действия, области применения и дан развернутый обзор функциональных особенностей различных моделей Raspberry pi2, Raspberry pi3, Raspberry pi model B.

Raspberry и «умный» дом

В 2011 году компания Raspberry Pi Foundation выпустила первый в мире миниатюрный, но полноценный компьютер разработанный Девидом Брабеном. Размер этого устройства сопоставим с размерами банковской карты. В то же время его технические параметры соответствуют топовым компьютерам 2005-10 годов.

Одними из самых привлекательных черт данной техники является ее доступность. Стоимость базовых моделей (model А) находится в области 25 дол США, а более продвинутых (model В) около 35 дол США. Конечно, на отечественном рынке эта техника стоит несколько дороже, так как сказываются высокие ввозные пошлины и налоговые отчисления, но все равно стоимость Raspberry не сопоставима с аналогичной крупномасштабной техникой.


Вторым немаловажным преимуществом является его феноменальная экономность. Raspberry Pi 2 потребляет все 1 Вт электроэнергии в час, в то время как его стационарный аналог не менее 250 Вт.

Что может Raspberry и как он работает?

Операционная система Raspberry Pi – Debian Linux, на данный момент практически все модели выпускаются с предустановленной специальной системой под названием Raspbian. В довесок ко всему в качестве браузера используется Midori, офисный пакет (аналог незаменимого World и Exel) Koffice.

Как же Такое оборудование может использоваться в ?


Представленный пример структуры состоит из центрального вычислительного устройства (далее сервер), связанного с периферийными модулями через RS485 – интерфейс. В каждом ключевом помещении дома устанавливается контроллер, который интерпретирует поступающие сигналы и передает их на исполнительные устройства различной бытовой техники. Это могут быть детекторы контроля, устройства регулировки и управления или датчики защиты.


Преимущества такой структуры заключаются в предоставлении определенной автономности периферии, которая будет выполнять поставленные задачи даже при выходе центрального устройства из строя. И элементарном упрощении задач по прокладке кабельных сетей. От сервера будет проложено по одному UTP кабелю к каждому контроллеру. Команды управления будут пересылаться по одной паре проводов, а остальные 3 пары будут использованы для подачи питания самих контроллеров и исполнительных устройств, находящихся под их управлением.

Центральным сервером системы является Raspberry Pi на котором установлен WEB-интерфейс, связанный с внешними мобильными устройствами управления – смартфоном, планшетом, ноутбуком. Доступ к ресурсу предоставляется по логину и паролю с сети интернет, Wi-Fi, или локальной Ethernet. У большинства ПО есть возможность разграничения уровня доступа на администраторский и пользовательский.

Связь модуля Raspberry Pi с контроллерами реализована через порт UART, к которому подключается согласующее устройство – переходник на интерфейс RS485. В последних моделях данный интерфейс реализован в базовой комплектации. Так же, реализована возможность подключения GSM модема для связи с мобильным оператором, предоставляющим провайдерские услуги доступа в глобальную сеть.

Кроме того существует и радиомодуль, основная задача которого привязка общей сети радиодатчиков и радиопультов управления.

Стандартная система «Умный дом» основанная на Raspberry Pi может включать следующие элементы:

  • Контроллер температуры и влажности на 8 каналов. Собирает показания о состоянии параметров через детектор DHT22 и 7 датчиков типа DHT11.
  • Четырехканальный термостат. Этот терморегулятор может контролировать параметры четырех отдельных линии нагрузки, как нагрева, так и охлаждения. Параметры могут задаваться непосредственно на контроллере или через WEB-интерфейс сервера.
  • Радиомодуль – используется для приема данных с 10 радиодатчиков и эмуляции 5 радиобрелоков;
  • Универсальный констроллер, может применяться для контроля и управления системой полива, отопления и т.д. имеет 2 входя для подключения детекторов влажности (DHT22) и температуры (DHT11).

Более подробно о функционировании описанной системы можно увидеть здесь:

Обзор моделей Raspberry Pi 2, Pi 3 model B

Процессор ARM Cortex-A7 с тактовой частотой 900МГц и 4 ядрами на борту. Объем оперативной памяти довольно солидный даже по современным меркам 1 ГБ. В плату интегрирован графический чипсет — VideoCore IV 3D и звуковой контроллер. Это дает возможность использовать устройство в качестве универсального мультимедийного сервера в .


Внешние интерфейсы:

HDMI – главное отличие от предыдущих разработок, заменил собой аналоговый RCA видеовыход. Однако возможность подключения телевизора через 3,5 мм разъем осталась. Необходимо дополнительно приобрести кабель переходник (стоимость около 5 дол).


Еще одним отличием от моделей предыдущего поколения является наличие системных файлов. Так же имеется Lan порт и 4 USB порта, которые могут выдать для питания внешних устройств ток силой 1,2 А каждый. Для этого сам Raspberry Pi должен быть подключен к специальному сетевому адаптеру, который обеспечит силу тока 2 А.

По сравнению с 1 и 2 версиями Raspberry Pi 3 не подверглась кардинальной модернизации. Однако эволюция развития основных технических показателей существенна. Основным отличием является высокопроизводительный четырехъядерный 1,2 ГГц процессор ARM Cortex-A53. По заверениям разработчиков создание такого процессора на базе однокристальной платформы Broadcom BCM2837 увеличило его производительность на 50%, и при этом он полностью совмести с предыдущими версиями.

Из основных интерфейсов связи можно отметить:

  • Bluetooth 4.1;
  • Wi-Fi 802.11n;
  • 4 USB;
  • HDMI;
  • 40ка пиновый GPIO.

Стоимость устройства не изменилась, все те же 35 дол плюс доставка от официального дилера в Великобритании.

Raspberry Pi незаменимое устройство для тех, кто самостоятельно занимается установкой и наладкой систем «Умный дом».

Введение

Данный проект берет свое начало в 2014 году, когда передо мной встала задача обеспечить удаленное управления обогревательными приборами в своем загородном доме. Дело в том, что практически каждые выходные мы с семьей проводим на даче. И если летом мы, задержавшись по тем или иным причинам в городе, приехав в дом могли сразу лечь спать, то зимой, когда температура опускается до -30 градусов, мне приходилось тратить по 3-4 часа на протопку дома. Я видел следующие пути решения данной проблемы:

    "Неумное решение" - можно оставлять включенными обогреватели со встроенными термостатами на минимальной температуре поддержания тепла. Собственно ничего "умного" в этом решении нет, но 24/7 работающие обогревательные приборы в деревянном загородном доме не внушают доверия. Хотелось хотя бы минимального контроля над их состоянием, автоматизации и какой-нибудь обратной связи;

    GSM-розетки - данным решением пользуются мои соседи по дачному участку. Если кто-то не знаком с ними, то это просто управляемый посредством SMS команд переходник, который включается в розетку, а сам обогреватель включается в него. Не самое бюджетное решение, если нужно обеспечить обогрев целого дома - ссылка на маркет . Я вижу его как самое простое и менее трудозатратное в реализации, но имеющее минусы в процессе эксплуатации, такие как: целый ворох сим карт и работы по поддержанию их положительного баланса, так как для каждой комнаты нужен минимум один обогреватель, ограниченность и неудобства их контроля по средствам SMS;

  1. "Умный дом" - собственно решения, построенные на реализации "умного дома".

Как наиболее перспективное решение мною был выбран третий вариант и следующим вопросом на повестке дня стал - "Какую платформу для реализации выбрать?".


Уже не помню сколько я потратил время на поиски подходящих вариантов, но в итоге из бюджетных и доступных в магазинах решений я нашел системы: NooLite и CoCo (сейчас уже переименовали в Trust). При их сравнении решающую роль для меня сыграло то, что у NooLite есть открытое и задокументированное API для управления любыми его блоками. На тот момент необходимости в нем не было, но я сразу отметил, какую гибкость в дальнейшем это может дать. Да и цена у NooLite была существенно ниже. В итоге я остановил свой выбор именно на NooLite.

Реализация 1 - автоматизация NooLite

Система NooLite состоит из силовых модулей (под разные типы нагрузок), датчиков (температура, влажность, движение) и управляющего ими оборудования: радио пульты, настенные выключателей, USB-адаптеров для компьютера или Ethernet-шлюза PR1132. Все это можно использовать в различных комбинациях, соединять их между собой напрямую или управлять через usb-адаптеры или шлюз, подробнее об этом можете почитать на официальном сайте производителя.


Для моей задачи центральным элементом умного дома я выбрал Ethernet-шлюза PR1132, который будет управлять силовыми блоками и получать информацию с датчиков. Для работы Ethernet-шлюза необходимо подключить его к сети кабелем, поддержки Wi-Fi в нем нет. На тот момент у меня в доме уже была организована сеть, состоящая из WiFi-маршрутизатора Asus rt-n16 и USB--модема для доступа к интернету. Поэтому весь монтаж NooLite для меня заключался лишь в том, чтобы подключить шлюз кабелем к маршрутизатору, расположить в доме радиодатчики температуры и смонтировать силовые блоки в центральном электрощитке.


У NooLite есть ряд силовых блоков для разной подключаемой нагрузки. Самый "мощный" блок может управлять нагрузкой до 5000 Вт. Если требуется управление большей нагрузкой, как в моем случае, то можно сделать подключение нагрузки через управляемое реле, которым, в свою очередь, будет управлять силовой блок NooLite.




Схема подключения



Ethernet-шлюза PR1132 и маршрутизатор Asus rt-n16



Беспроводной датчик температуры и влажности PT111



Электрощиток и силовой блок для наружного монтажа SR211 - в дальнейшем вместо этого блока я использовал блок для внутреннего монтажа и поместил его прямо в электрощитке


Ethernet-шлюз PR1132 имеет web-интерфейс через которой осуществляется привязка/отвязка силовых блоков, датчиков и управление ими. Сам интерфейс выполнен в довольно "топорном" минималистическом стиле, но этого вполне достаточно для доступа ко всему необходимому функционалу системы:




Настройки




Управление




Страница одной группы выключателей


Подробно о привязке и настройке всего этого - опять же на официальном сайте.


На тот момент я мог:

  • управлять обогревателями, находясь в локальной сети загородного дома, что было не очень-то и полезно, исходя из первоначальной задачи;
  • создавать таймеры включения/отключения по времени и дню недели.

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

Реализация 2 - удаленный доступ к умному дому

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


Как я упомянул в предыдущем разделе - дачная сеть имеет доступ к интернету через usb модем одного из мобильных операторов. По умолчанию мобильные модемы имеют серый ip адрес и без дополнительных ежемесячных трат белого фиксированного ip не получить. При таком сером IP не помогут и различные no-ip сервисы.


Единственный вариант, который мне удалось на тот момент придумать - VPN. На городском маршрутизаторе у меня был настроен VPN-сервер, которым я время от времени пользовался. Мне было необходимо настроить на дачном роутере VPN-клиент и прописать статические маршруты до дачной сети.




Схема подключения


В результате дачный роутер постоянно держал VPN соединение с городским роутером и для доступа к шлюзу NooLite мне нужно было с клиентского устройства (ноутбук, телефон) подключится по VPN к городскому маршрутизатору.


На этом этапе я мог:

  • получить доступ к умному дому из любого места;

В целом это практически на 100% покрывало первоначальную задачу. Однако я понимал, что данная реализация далека от оптимальной и удобной в использовании, так как каждый раз я должен был выполнять ряд дополнительных действий по подключению к VPN. Для меня это не было особой проблемой, однако для остальных членов семьи это было не очень удобно. Так же в этой реализации было очень много посредников, что сказывалось на отказоустойчивости всей системы в целом. Однако на некоторое время я остановился именно на этом варианте.

Реализация 3 - Telegram bot

С появлением ботов в Telegram я взял на заметку, что это смогло бы стать довольно удобным интерфейсом для управления умным домом и, как только у меня появилось достаточно свободного времени, я приступил к разработке на Python 3.


Бот должен был где-то находится и, как самое энергоэффективное решение, я выбрал Raspberry Pi. Хоть это и был мой первый опыт работы с ним, особых сложностей в его настройке не возникло. Образ на карту памяти, ethernet кабель в порт и по ssh - полноценный Linux.


Как я уже говорил - у NooLite есть задокументированное API, которое и пригодилось мне на данном этапе. Для начала я написал простенькую обертку для более удобного взаимодействия с API:


noolite_api.py

""" NooLite API wrapper """ import requests from requests.auth import HTTPBasicAuth from requests.exceptions import ConnectTimeout, ConnectionError import xml.etree.ElementTree as ET class NooLiteSens: """Класс хранения и обработки информации, полученной с датчиков Пока как таковой обработки нет """ def __init__(self, temperature, humidity, state): self.temperature = float(temperature.replace(",", ".")) if temperature != "-" else None self.humidity = int(humidity) if humidity != "-" else None self.state = state class NooLiteApi: """Базовый враппер для общения с NooLite""" def __init__(self, login, password, base_api_url, request_timeout=10): self.login = login self.password = password self.base_api_url = base_api_url self.request_timeout = request_timeout def get_sens_data(self): """Получение и прасинг xml данных с датчиков:return: список NooLiteSens объектов для каждого датчика:rtype: list """ response = self._send_request("{}/sens.xml".format(self.base_api_url)) sens_states = { 0: "Датчик привязан, ожидается обновление информации", 1: "Датчик не привязан", 2: "Нет сигнала с датчика", 3: "Необходимо заменить элемент питания в датчике" } response_xml_root = ET.fromstring(response.text) sens_list = for sens_number in range(4): sens_list.append(NooLiteSens(response_xml_root.find("snst{}".format(sens_number)).text, response_xml_root.find("snsh{}".format(sens_number)).text, sens_states.get(int(response_xml_root.find("snt{}".format(sens_number)).text)))) return sens_list def send_command_to_channel(self, data): """Отправка запроса к NooLite Отправляем запрос к NooLite с url параметрами из data:param data: url параметры:type data: dict:return: response """ return self._send_request("{}/api.htm".format(self.base_api_url), params=data) def _send_request(self, url, **kwargs): """Отправка запроса к NooLite и обработка возвращаемого ответа Отправка запроса к url с параметрами из kwargs:param url: url для запроса:type url: str:return: response от NooLite или исключение """ try: response = requests.get(url, auth=HTTPBasicAuth(self.login, self.password), timeout=self.request_timeout, **kwargs) except ConnectTimeout as e: print(e) raise NooLiteConnectionTimeout("Connection timeout: {}".format(self.request_timeout)) except ConnectionError as e: print(e) raise NooLiteConnectionError("Connection timeout: {}".format(self.request_timeout)) if response.status_code != 200: raise NooLiteBadResponse("Bad response: {}".format(response)) else: return response # Кастомные исключения NooLiteConnectionTimeout = type("NooLiteConnectionTimeout", (Exception,), {}) NooLiteConnectionError = type("NooLiteConnectionError", (Exception,), {}) NooLiteBadResponse = type("NooLiteBadResponse", (Exception,), {}) NooLiteBadRequestMethod = type("NooLiteBadRequestMethod", (Exception,), {})



telegram_bot.py

import os import logging import functools import yaml import requests import telnetlib from requests.exceptions import ConnectionError from telegram import ReplyKeyboardMarkup, ParseMode from telegram.ext import Updater, CommandHandler, Filters, MessageHandler, Job from noolite_api import NooLiteApi, NooLiteConnectionTimeout,\ NooLiteConnectionError, NooLiteBadResponse # Получаем конфигурационные данные из файла config = yaml.load(open("conf.yaml")) # Базовые настройка логирования logger = logging.getLogger() logger.setLevel(logging.INFO) formatter = logging.Formatter("%(asctime)s - %(filename)s:%(lineno)s - %(levelname)s - %(message)s") stream_handler = logging.StreamHandler() stream_handler.setFormatter(formatter) logger.addHandler(stream_handler) # Подключаемся к боту и NooLite updater = Updater(config["telegtam"]["token"]) noolite_api = NooLiteApi(config["noolite"]["login"], config["noolite"]["password"], config["noolite"]["api_url"]) job_queue = updater.job_queue def auth_required(func): """Декоратор аутентификации""" @functools.wraps(func) def wrapped(bot, update): if update.message.chat_id not in config["telegtam"]["authenticated_users"]: bot.sendMessage(chat_id=update.message.chat_id, text="Вы неавторизованы.\nДля авторизации отправьте /auth password.") else: return func(bot, update) return wrapped def log(func): """Декоратор логирования""" @functools.wraps(func) def wrapped(bot, update): logger.info("Received message: {}".format(update.message.text if update.message else update.callback_query.data)) func(bot, update) logger.info("Response was sent") return wrapped def start(bot, update): """Команда начала взаимодействия с ботом""" bot.sendMessage(chat_id=update.message.chat_id, text="Для начала работы нужно авторизоваться.\n" "Для авторизации отправьте /auth password.") def auth(bot, update): """Аутентификация Если пароль указан верно, то в ответ приходит клавиатура управления умным домом """ if config["telegtam"]["password"] in update.message.text: if update.message.chat_id not in config["telegtam"]["authenticated_users"]: config["telegtam"]["authenticated_users"].append(update.message.chat_id) custom_keyboard = [ ["/Включить_обогреватели", "/Выключить_обогреватели"], ["/Включить_прожектор", "/Выключить_прожектор"], ["/Температура"] ] reply_markup = ReplyKeyboardMarkup(custom_keyboard) bot.sendMessage(chat_id=update.message.chat_id, text="Вы авторизованы.", reply_markup=reply_markup) else: bot.sendMessage(chat_id=update.message.chat_id, text="Неправильный пароль.") def send_command_to_noolite(command): """Обработка запросов в NooLite. Отправляем запрос. Если возращается ошибка, то посылаем пользователю ответ об этом. """ try: logger.info("Send command to noolite: {}".format(command)) response = noolite_api.send_command_to_channel(command) except NooLiteConnectionTimeout as e: logger.info(e) return None, "*Дача недоступна!*\n`{}`".format(e) except NooLiteConnectionError as e: logger.info(e) return None, "*Ошибка!*\n`{}`".format(e) except NooLiteBadResponse as e: logger.info(e) return None, "*Не удалось сделать запрос!*\n`{}`".format(e) return response.text, None # ========================== Commands ================================ @log @auth_required def outdoor_light_on(bot, update): """Включения уличного прожектора""" response, error = send_command_to_noolite({"ch": 2, "cmd": 2}) logger.info("Send message: {}".format(response or error)) bot.sendMessage(chat_id=update.message.chat_id, text="{}".format(response or error)) @log @auth_required def outdoor_light_off(bot, update): """Выключения уличного прожектора""" response, error = send_command_to_noolite({"ch": 2, "cmd": 0}) logger.info("Send message: {}".format(response or error)) bot.sendMessage(chat_id=update.message.chat_id, text="{}".format(response or error)) @log @auth_required def heaters_on(bot, update): """Включения обогревателей""" response, error = send_command_to_noolite({"ch": 0, "cmd": 2}) logger.info("Send message: {}".format(response or error)) bot.sendMessage(chat_id=update.message.chat_id, text="{}".format(response or error)) @log @auth_required def heaters_off(bot, update): """Выключения обогревателей""" response, error = send_command_to_noolite({"ch": 0, "cmd": 0}) logger.info("Send message: {}".format(response or error)) bot.sendMessage(chat_id=update.message.chat_id, text="{}".format(response or error)) @log @auth_required def send_temperature(bot, update): """Получаем информацию с датчиков""" try: sens_list = noolite_api.get_sens_data() except NooLiteConnectionTimeout as e: logger.info(e) bot.sendMessage(chat_id=update.message.chat_id, text="*Дача недоступна!*\n`{}`".format(e), parse_mode=ParseMode.MARKDOWN) return except NooLiteBadResponse as e: logger.info(e) bot.sendMessage(chat_id=update.message.chat_id, text="*Не удалось получить данные!*\n`{}`".format(e), parse_mode=ParseMode.MARKDOWN) return except NooLiteConnectionError as e: logger.info(e) bot.sendMessage(chat_id=update.message.chat_id, text="*Ошибка подключения к noolite!*\n`{}`".format(e), parse_mode=ParseMode.MARKDOWN) return if sens_list.temperature and sens_list.humidity: message = "Температура: *{}C*\nВлажность: *{}%*".format(sens_list.temperature, sens_list.humidity) else: message = "Не удалось получить данные: {}".format(sens_list.state) logger.info("Send message: {}".format(message)) bot.sendMessage(chat_id=update.message.chat_id, text=message, parse_mode=ParseMode.MARKDOWN) @log @auth_required def send_log(bot, update): """Получение лога для отладки""" bot.sendDocument(chat_id=update.message.chat_id, document=open("/var/log/telegram_bot/err.log", "rb")) @log def unknown(bot, update): """Неизвестная команда""" bot.sendMessage(chat_id=update.message.chat_id, text="Я не знаю такой команды") def power_restore(bot, job): """Выполняется один раз при запуске бота""" for user_chat in config["telegtam"]["authenticated_users"]: bot.sendMessage(user_chat, "Включение после перезагрузки") def check_temperature(bot, job): """Периодическая проверка температуры с датчиков Eсли температура ниже, чем установленный минимум - посылаем уведомление зарегистрированным пользователям """ try: sens_list = noolite_api.get_sens_data() except NooLiteConnectionTimeout as e: print(e) return except NooLiteConnectionError as e: print(e) return except NooLiteBadResponse as e: print(e) return if sens_list.temperature and \ sens_list.temperature < config["noolite"]["temperature_alert"]: for user_chat in config["telegtam"]["authenticated_users"]: bot.sendMessage(chat_id=user_chat, parse_mode=ParseMode.MARKDOWN, text="*Температура ниже {} градусов: {}!*".format(config["noolite"]["temperature_alert"], sens_list.temperature)) def check_internet_connection(bot, job): """Периодическая проверка доступа в интернет Если доступа в интрнет нет и попытки его проверки исчерпаны - то посылаем по telnet команду роутеру для его перезапуска. Если доступ в интернет после этого не появился - перезагружаем Raspberry Pi """ try: requests.get("http://ya.ru") config["noolite"]["internet_connection_counter"] = 0 except ConnectionError: if config["noolite"]["internet_connection_counter"] == 2: tn = telnetlib.Telnet(config["router"]["ip"]) tn.read_until(b"login: ") tn.write(config["router"]["login"].encode("ascii") + b"\n") tn.read_until(b"Password: ") tn.write(config["router"]["password"].encode("ascii") + b"\n") tn.write(b"reboot\n") elif config["noolite"]["internet_connection_counter"] == 4: os.system("sudo reboot") else: config["noolite"]["internet_connection_counter"] += 1 dispatcher = updater.dispatcher dispatcher.add_handler(CommandHandler("start", start)) dispatcher.add_handler(CommandHandler("auth", auth)) dispatcher.add_handler(CommandHandler("Температура", send_temperature)) dispatcher.add_handler(CommandHandler("Включить_обогреватели", heaters_on)) dispatcher.add_handler(CommandHandler("Выключить_обогреватели", heaters_off)) dispatcher.add_handler(CommandHandler("Включить_прожектор", outdoor_light_on)) dispatcher.add_handler(CommandHandler("Выключить_прожектор", outdoor_light_off)) dispatcher.add_handler(CommandHandler("log", send_log)) dispatcher.add_handler(MessageHandler(, unknown)) job_queue.put(Job(check_internet_connection, 60*5), next_t=60*5) job_queue.put(Job(check_temperature, 60*30), next_t=60*6) job_queue.put(Job(power_restore, 60, repeat=False)) updater.start_polling(bootstrap_retries=-1)


Данный бот запускается на Raspberry Pi под Supervisor, который контролирует его состояние и запускает его при перезагрузке.




Схема работы бота


При запуске бот:

  • посылает зарегистрированным пользователям сообщение о том, что он включился и готов к работе;
  • мониторит подключение к интернету. В условии работы через мобильный интернет были случаи, когда он пропадал. Поэтому была добавлена периодическая проверка доступности подключения. Если заданное количество проверок заканчивается неудачей, то сначала скрипт перезагружает через telnet маршрутизатор, а потом, если это не помогло, и сам Raspberry Pi;
  • мониторит температуру внутри помещения и отправляет пользователю уведомление, если она опустилась ниже заданного порога;
  • выполняет команды от зарегистрированных пользователей.

Команды жестко прописаны в коде и включают в себя:

  • включение/выключение обогревателей;
  • включение/выключение уличного прожектора;
  • получение температуры с датчиков;
  • получение файла логов для дебага.

Пример общения с ботом:



В итоге я и все члены семьи получили довольно удобный интерфейс управления умным домом через Telegram. Все, что нужно сделать - установить телеграмм клиент на свое устройство и знать пароль для начала общения с ботом.


В итоге я могу:

  • управлять умным домом из любого места с любого устройства со своей учетной записью Telegram;
  • получать информацию с датчиков, расположенных в доме.

Данная реализация на все 100% решила первоначальную задачу, была удобной и интуитивно понятной в использовании.

Заключение

Бюджет (по текущим ценам):

  • NooLite Ethernet-шлюз - 6.000 рублей
  • NooLite силовой датчик для управления нагрузкой - 1.500 рублей
  • NooLite датчик температуры и влажности - 3.000 рублей (без влажности дешевле)
  • Raspberry Pi - 4.000 рублей

На выходе у меня получилось довольно гибкая бюджетная система, которую можно легко расширять по мере необходимости (NooLite шлюз поддерживает до 32 каналов). Я и члены семьи могут с легкостью пользоваться ей без необходимости выполнять какие-то дополнительные действия: зашел в телеграмм - проверил температуру - включил обогреватели.


На самом деле данная реализация не последняя. Буквально неделю назад я подключил всю эту систему к Apple HomeKit, что позволило добавить управление через приложение для iOS "Дом" и соответствующую интеграцию с Siri для голосового управления. Но процесс реализации тянет на отдельную статью. Если сообществу будет интересна данная тема, то готов в ближайшее время подготовить еще одну статью.



Сложно игнорировать технологичные новинки, которые уже давно стали частью повседневной жизни. Среди таких привычных вещей, как интернет или смартфоны, особенно выделяется умный дом, помогающий объединить используемые гаджеты и бытовую технику в единую сеть для более комфортного и простого управления. Умный дом легко настроить под собственные потребности, вводы в состав сети новые модули и программируя их на выполнение заданных сценариев. Сенсоры, используемые в процессе управления домом, срабатывают:

  • На звук;
  • На движение;
  • На тепловую энергию.

Простые сенсоры представлены даже в ТРЦ, где они следят за автоматическим открытием дверей и выполняют другие задачи. В то, что умный дом может стать неотъемлемым элементом жизни человека может и сложно поверить, но это действительно так. Чтобы снизить свои трудозатраты и обучить приборы выполнять простые функции самостоятельно, потребуется лишь реализовать проект умный дом, способствующий всему этому.

Принцип работы умного дома

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

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

Процесс работы зависит от правильности расчётов, выполненных владельцем, что приводит к снижению расходов. Самостоятельно собрать умный дом не сложно, если подойти к делу со всей осторожностью и пониманием. В итоге это сэкономит средства, и позволит получить некоторые навыки обращения с модулями.

Процесс автоматизации умного дома

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

  • модель А;
  • модель В.

Визуальное оформление и комплектация

Данные устройства находятся под управлением чипсета ARM11 с производительностью в 700 МГц. Различия между вариациями заключаются в объеме памяти на борту. Так изделие B оснащается планкой ОЗУ на 512 Мб, что двукратно превосходит показатели модели А с 256 Мб. В итоге компания пришла к решению выпускать обе вариации одновременно, тем более, что миникомпьютер А имел дополнительные достоинства. Он оснащался портом Ethernet, позволяющим подключиться к сети. Компания продолжила работу над модернизацией своих продуктов, переосмыслив вторую версию компьютера. Это привело к появлению улучшенного варианта В, ставшего еще более компактным, а также получившего стильный дизайн. Из конструктивных наработок стоит отметить наличие 4 разъемов USB, что в 2 раза превышает число портов данного типа для предыдущей версии.

Читайте также: Датчик протечки воды своими руками

Устройство хорошо зарекомендовало себя в сфере создания умных домов. Небольшая цена делает Raspberry отличным выбором для построения всего проекта, а многофункциональность миникомпьютера справляется со сложными задачами. Автоматизация приборов на базе подобного агрегата становится лучшим среди доступных решений.

Raspberry способен контролировать устройства Z-Wave, облегчающие управление домашней техникой. Установка платы RaZberry в миниПК делает блок управления производительным и надежным. Z-Wave представляет современный стандарт для умного дома, выполненного с помощью беспроводного технологического процесса. В результате владелец имеет возможность отказаться от использования дополнительных элементов и расходных материалов, снижая общие затраты. Управлять Z-Wave легко. Поэтому реализовать умный дом способен человек, не имеющий практического опыта в работе над подобными проектами.

Дополнительным преимуществом является возможность модернизировать существующую плату. Так если наблюдается снижение производительности, которой уже недостаточно для работы модулей, то Z-Wave можно модернизировать, используя вспомогательные элементы, как в случае с улучшением стандартного ПК. Выполнение апгрейда исключает необходимость полностью менять устройство.

Контроллер от компании Z-Wave

Если у пользователя недостаточно опыта или свободного времени для выполнения монтажа, то в Z-Wave могут предложить услуги по настройке или установке оборудования в любом регионе РФ. Любые вопросы можно решить с помощью обширной базы данных, находящейся в свободном доступе, либо используя техническую поддержку. Raspberry зарекомендовала себя с лучшей стороны и в сфере видеонаблюдения. Используя плату и стандартную веб-камеру пользователь получает систему, которая способна транслировать изображение в сеть, вне зависимости от расположения устройства слежения. Следить за объектом становится еще проще, так как нет нужды постоянно мониторить ситуацию. Достаточно отследить основные события в конце работы, чтобы узнать о любых происшествий, зафиксированных видеокамерой.

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

Разработать такой дом не сложно, особенно при тщательном подходе. В итоге владелец становится получателем огромной пользы благодаря своим нововведениям. Определившись в особенностях автоматизации, можно значительно сократить расход времени, а также экономить энергоресурсы и увеличить безопасность для жителей дома. Удобство определяется выбранными компонентами, на которых базируется проект, поэтому Raspberry станет надежным помощником в деле создания умного дома.

Умный дом на Raspberry Pi

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

Состав блока управления

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

  • NodeMCU ESP-12E;
  • Объемный сенсор;
  • Сенсоры температуры;
  • Сенсоры влажности
  • модуль реле;
  • карта памяти;
  • RaspberryPi 3.

Сам процессор, а в данной конфигурации это третья модель, выбирается произвольно, поэтому другая версия будет не менее работоспособной и подойдет для умного дома. Выбор в пользу Raspberry Pi 3 вызван тем, что агрегат комплектуется модулями беспроводной связи. Заменить NodeMCU можно Arduino Nano, либо использовать вспомогательный модуль для вай-фай.

Читайте также: В скором времени Siri сможет адаптировать свои ответы к человеку

Компоненты, составляющие блок управления, следует соединить и отрегулировать. Чтобы сократить расход времени и усилий будет выгодно приобрести именно готовое решение, вроде NodeMCU. Силовое элементы выбираются в количестве, задействованном в проекте. Для представленной конфигурации потребуется 3 элемента. Конфигурация сенсоров определяется индивидуально. При желании можно отказаться от объемного сенсора, если его применение не будет иметь логической потребности.

Установка Raspbian

Чтобы справиться с установкой ОС, потребуется посетить официальную страницу компании, где можно всегда найти и загрузить самую свежую версию. Далее выполняется форматирования карты в FAT. По указанным предписаниям выполняем сборку образа под используемую ОС. Остается подключить карту к миникомпьютеру, а также присоединить клавиатуру и экран, в роли которого может выступать ТВ. Процесс загрузки обычно занимает немного времени, после чего можно приступать к настройкам.

Так можно задать собственный пароль и другие параметры. Не стоит менять текущую настройку загрузочного экрана, так как во время работы умного дома графическая часть использоваться не будет. Переходим к изменению хоста, расположенного в пункте Hostname, а также задаем SSH, что позволит с большим комфортом управлять устройством в будущем. Когда все настройки будут применены, останется только перезагрузить устройство, нажав Finish.

Корректировка WIFI

Когда устройство будет перезапущено, следует перейти к интерфейсам, где порядок действий следующий:

  • Прописываем команду sudo nano /etc/network/interfaces;
  • Находим часть iface wlan0 inet manual и заменяем эту строку на iface wlan0 inet static,
  • Не забываем указать собственный статичный айпи-адрес.

Пример проделанной работы выглядит следующим образом:

auto wlan0 allow-hotplug wlan0 iface wlan0 inet static address 192.168.1.150 netmask 255.255.255.0

gateway 192.168.1.1 wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf address, netmask, gateway —

но в вашем случае настройка должна проходить под собственный роутер.

Следующим шагом будет переход к супликанту, где следует указать такую команду

sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

Открывшееся окно позволяет ввести все необходимые настройки для беспроводной сети.

Пример настроек:

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev

update_config=1

network={ ssid=» ваш SSID » psk=»ваш пароль» }

sudo ifdown wlan0

Процесс будет выполнен, после чего остается указать

sudo ifup wlan0

ожидаем завершения перезагрузки, вызванной командой

sudo reboot

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

Обновление миникомпьютера

Перед началом дальнейшей корректировки следует справиться с апдгрейдом системы. Последовательность не сложная:

  • вводим sudo apt-get update sudo apt-get upgrade;
  • проверяем текущую версию командой g++-4.9 –v и сверяемся с актуальной;
  • если используемая версия устарела, то вводим sudo apt-get install g++.

Переходим к установке NODE.JS. Данная программа, начиная с четвертой версии, поддерживает ARM. Для того, чтобы поставить NODE.JS, потребуется задать последовательность команд:

  • curl -sL https://deb.nodesource.com/setup_6.x;
  • sudo -E bash — sudo apt-get install -y nodejs;
  • для проверки текущей версии вводим nodejs –v.

Устанавливаем HOMEBRIDGE

Первым шагом будет установка Avahi и другие компоненты, которые потребуются для работы MDNS. Переходим в командную строку и начинаем вводить такую последовательность

  • sudo apt-get install avahi-daemon avahi-discover libnss-mdns libavahi-compat-libdnssd-dev;
  • sudo npm install -g —unsafe-perm homebridge hap-nodejs node-gyp;
  • cd /usr/lib/node_modules/homebridge/;
  • sudo npm install —unsafe-perm bignum;
  • cd /usr/lib/node_modules/hap-nodejs/node_modules/mdns;
  • sudo node-gyp BUILDENGINE=Release rebuild.

В целях проверки выполняем пробный запуск командой homebridge, а в ответ следует ожидать примерно такую последовательность:

config.json (/home/pi/.homebridge/config.json) not found.

Scan this code with your HomeKit App on your iOS device to pair with Homebridge:

│ 031-45-154 │

Homebridge is running on port 44278

Если нечто похожее удалось получить, предыдущие команды были выполнены и применены верно. Как можно видеть из примера, программе не удалось обнаружить config.json, что значит, что его созданием придется заниматься самостоятельно:

  • sudo -i;
  • mkdir /root/.homebridge;
  • touch /root/.homebridge/config.json.

Всем доброго времени суток!

С некоторых пор меня заинтересовала тема домашней автоматизации, или умного дома. Так как раньше я с этой темой никоим образом не пересекался (как наверное и многие из вас, которые сейчас читают эту статью), то потратил достаточное количество времени на просвещение в интернете. От дорогостоящих "готовых" систем умного дома я сразу отказался, и решил делать свою систему домашней автоматизации бюджетно, с нуля и поэтапно. Так как готовых проектов с пошаговыми инструкциями (рассчитанных на абсолютных новичков) в глобальной сети я не нашел, то и решил написать этот цикл статей. Здесь я буду подробнейшим образом и пошагово описывать создание своей конкретной системы домашней автоматизации. Должно получиться своего рода руководство для тех людей, которые сами хотят создать подобную систему, но, не обладают необходимыми знаниями (для абсолютных новичков). На выходе у нас получится собранная с нуля готовая система умного дома.

Поскольку речь здесь пойдет о конкретной системе домашней автоматизации, то рассказывать как и из чего я выбирал, я не буду. Моя система будет базироваться на платформе MajorDoMo (это такое программное обеспечение). Почитать, что она из себя представляет, вы можете на официальном сайте данной платформы. В качестве сервера, на который будет установлена платформа MajorDoMo я буду использовать одноплатный компьютер Raspberry pi 3 model B+ с установленной на него операционной системой Raspbian.

Итак, начнем!

У меня есть новый одноплатный компьютер Raspberry pi 3 model B+ , и мне в первую очередь нужно установить на него операционную систему .

Вообще для этого компьютера существует множество Linux-based операционных систем, но я выбрал Raspbian - официальную операционную систему для Raspberry pi. Если у вас есть такой же одноплатник, то вы можете не напрягаться и сразу поставить на него операционную систему вместе с MajorDoMo, скачав базовый образ с официального сайта MajorDoMo . Я же пойду немного более трудоемким путем, и сначала установлю себе Raspbian (так как хочу немного поближе познакомиться с Linux), а потом платформу умного дома MajorDoMo.

Помимо Raspberry pi под MajorDoMo можно выбрать другие одноплатные компьютеры (или же обычные компьютеры, ноутбуки, нетбуки) и другие операционные системы. В этом случае могут отличаться от рассмотренных в данной статье только способы установки платформы MajorDoMo. Дальнейшая настройка самой платформы я так думаю везде будет одинаковой (но не совсем уверен, так как сам пока с платформой не работал, и думаю, что в дальнейшем этот вопрос прояснится).

Для установки операционной системы Raspbian в одноплатный компьютер, нам понадобится:

  • MicroSD карта объемом не менее 8 Гб
  • Обычный персональный компьютер (ноутбук) на Windows
  • программа (скачать ее можно с официально сайта).
  • образ операционной системы Raspbian (я выбрал Raspbian Stretch Lite без графической оболочки, так как работать с raspberry буду только по удаленке, скачать этот образ можно так же с официального сайта)

Сам процесс установки довольно прост:

  • В обычный компьютер (ноутбук) вставляем MicroSD карту.
  • Запускаем программу Etcher.

  • Нажимаем первую кнопку Select image , после чего откроется проводник, при помощи которого мы выберем скачанный ранее образ Raspbian.
  • Далее, при помощи второй кнопки Select drive нужно будет выбрать нашу MicroSD карту, в которую будет записан образ системы. Если в компьютер воткнута только одна карта, то она будет выбрана автоматически.

  • Ну и последнее, нажимаем кнопку Flash! , после чего происходит запись образа Raspbian на карту памяти.

Все! Теперь можно достать карту памяти из компьютера и воткнуть ее в специальный слот на нижней стороне Raspberry pi.

Наш одноплатник готов к работе. Чтобы убедиться в этом, нам понадобится телевизор или монитор с HDMI входом, и HDMI кабель. Подключиться удаленно к raspberry на данном этапе не получится, так как SSH в raspbian по умолчанию отключен (с этим мы разберемся в следующей статье).

Давайте подключим HDMI кабель к HDMI выходу микрокомпьютера и HDMI входу телевизора (монитора).

Теперь включаем телевизор и подаем питание на микрокомпьютер от обычного зарядного устройства для смартфонов с Микро USB разъемом. (Желательно, чтобы это зарядное устройство было не менее чем на 2 А, на случай дальнейшего расширения одноплатника).

При подаче питания одноплатник включится автоматически (никаких кнопок включения на нем нет). На экране телевизора (монитора) мы при этом увидим процесс загрузки операционной системы. Когда операционка загрузится, нам будет предложено ввести логин и пароль для входа в систему. (Графическая оболочка в нашем варианте отсутствует, имеется только командная строка).

Логин по умолчанию - pi , а пароль - raspberry .

На этом на сегодня мы закончим.

В следующей статье мы рассмотрим необходимую настройку Raspbian, включим SSH и зайдем на наш одноплатный компьютер по удаленке.

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

Еще статьи: