10 августа 2016 в 19:47

Управляем устройствами NooLite с роутера Zyxel Keenetic из песочницы

image

В этой статье я расскажу о том, как управлять устройствами nooLite через USB переходник РС1ххх прямо из роутера Zyxel Keenetic — без участия компьютера.

Преамбула


Темы про NooLite уже не раз тут мелькали, но, на всякий случай напомню, что это компоненты для построения «умного дома», общающиеся между собой посредством радиоканала. А ещё к их системе можно заказать USB адаптер, позволяющий отправлять команды с компьютера (на самом деле есть и тот, который может эти команды получать, но мы сейчас его рассматривать не будем). Когда-то давно я специально поднимал у себя на машине Web-сервер, на который можно было зайти с компьютера или телефона в домашней сети и управлять освещением, а также добавлять запланированные задачи. Например — я, как истинный сова, с трудом просыпаюсь рано утром, и даже с удовольствием не делал бы этого, но надо. И пробуждаться в темноте от звука будильника, было крайне тяжело, даже если поставить на него самую милую мелодию, из всех милых мелодий на земле. И я решил провести эксперимент, написав скрипт для плавного включения света, когда яркость увеличивается с 0 до 100% за 20 минут, тем самым имитируя восход солнца, и эксперимент удался — просыпаться стало значительно легче, когда свет не резко бьёт по глазам, а едва заметно нарастает, и организм реагирует на подобное пробуждение намного лучше будильника… Но что-то я ушёл от темы. Все это работало себе спокойно, и впрочем меня даже не напрягало то, что требуется постоянно включенный компьютер, у меня стоят тихие вентиляторы и его практически не слышно, но не так давно узнав, что на Zyxel Keenetic с прошивкой второй версии снова можно ставить пакеты OpenWRT у меня в голове начала созревать идея. И когда эта идея совсем меня допекла, никак не желая оставить в покое мой мозг, я решился — а, черт с ним! Впереди выходные, и я сделаю это!

Повестка дня


Итак, что же я собственно сделал? Сделал я следующее:

— Веб-интерфейс управления светом и нагрузками прямо в роутере Zyxel Keenetic.
— Команды отправляются непосредственно с роутера, через USB передатчик NooLite (РС1ххх) воткнутый в USB порт роутера.
— В веб-интерфейсе можно настраивать запланированные задачи для cron для управления светом.
— Консольная утилита, позволяющая отправлять команды непосредственно из командной строки роутера (под SSH) и если мой веб-интерфейс пришёлся не по вкусу, можно написать свой или встроить её вызов откуда угодно.

Shut up and take my money
Итак, что нам потребуется для настройки. Для начала подготовим роутер, делается это просто и достаточно подробно расписано тут. Дальше нам потребуется доустановить несколько пакетов, посему выполняем следующее:

opkg update
opkg install php5-cgi lighttpd-mod-fastcgi cron 

Эта команда устанавливает Веб-сервер, PHP, и cron для планирования задач. Я бы ещё Midnight Commander поставил, ибо удобнее:
opkg install mc

Дальше редактируем настройки Web-сервера: /opt/etc/lighttpd/lighttpd.conf указав верный порт:
server.port = 82

80-й порт уже занять Web-интерфейсом роутера, поэтому выбираем другой.
Затем редактируем файл:/opt/etc/lighttpd/conf.d/30-fastcgi.conf, сделав так:

fastcgi.server = ( ".php" =>
( "php-local" =>
(
"socket" => "/opt/tmp/php-fastcgi-1.socket",
"bin-path" => "/opt/bin/php-fcgi",
"max-procs" => 1,
"broken-scriptfilename" => "enable",
)
),
# .....
# .....
)


Вот и все, а теперь запускаем сервер:

lighttpd -f /opt/etc/lighttpd/lighttpd.conf 

На этом подготовка закончена, и можно приступать к самому главному. Качаем этот архив. В нем находится программа, пару либов, и php файлы. Из папки binaries закидываем бинарники на флешку роутера, bin в bin, lib в lib, share в share. По идее он не должен предлагать что-то заменять, но если предложит — отказываемся, ибо тут надо разбираться. Если вы мне не доверяется, то в архиве в папке source лежит исходник утилиты для отправки команд NooLite, можете собрать его сами. Как это сделать — тема отдельная, здесь расписывать не буду, информации по этому поводу в сети много. Итак, если все файлы закинуты по своим местам, можно проверить работоспособность всего этого чуда. Идём в браузер и вводим IP адрес роутера и порт, который был вами указан в настройке веб-сервера.
http://192.168.1.1:82/

image

Тут мы должны увидеть страницу с управление освещением. Но не вашим, а моим. Для того, чтобы сделать свои настройки, вам понадобиться отредактировать файл: /opt/share/www/config.php

image

Я специально продокументировал его комментариями, думаю проблем с его редактированием не возникнет. После того как, вы настроите все под свою конфигурацию — можно начинать пользоваться. Веб-интерфейс сделан больше под мобильные устройства, но на десктопе тоже можно вполне пользоваться. Отдельное внимание обращаю на то, что создавать, включать, выключать и удалять задания для cron, можно прямо из браузера, при изменениях cron будет перезапущен и вам не надо ни о чем думать. Если же вы хотите пользоваться консольной утилитой, то просто наберите в SSH команду:
noolite

Вам выведется список параметров, тут тоже ничего сложного.

image

Я проверял это на Zyxel Keenetic Giga II, у него 2 USB порта, но насколько я знаю, на роутерах с одним USB портом, можно использовать хаб. Я решил это проверить и у меня через хаб заработало.

Вот и все, надеюсь вам было интересно и вы сочли эту статью полезной. Если есть вопросы — задавайте, буду рад ответить.
@CodeName33
карма
5,0
рейтинг 0,0
Программист
Самое читаемое

Комментарии (28)

  • 0
    Зачем ставить лайти если есть uhttpd, создайте виртуальные хосты для Web-интерфейса роутера и для «умного дома». Web-интерфейс следовало бы перекинуть на 82-ой порт, а «умный дом» на 80-й, так логичнее. И конечно же необходимо добавить аутентификацию (сложное слово), пускай она и слабенькая, но это лучше чем ничего.

    Ну или в лайти добавьте аутентификацию:

    server.modules = ( 
    ...
    "mod_auth",
    ...
    )
    ...
    ...
    
    $HTTP["url"] =~ "^/" {
            auth.backend = "plain"
            auth.backend.plain.userfile = "/etc/lighttpd/lighttpd.std"
            auth.require = ( "/" =>
             (
               "method" => "basic",
               "realm" => "/",
               "require" => "valid-user"
             )
            )
      }
    ...
    


    Создать файл lighttpd.std с содержимым:

    логин:пароль
    

    Это хоть какая-то «защита»...

    • 0
      Зачем авторизация во внутренней сети? Если во внешнюю прокидывать — то да, нужна. А в домашней сети у меня «левых» устройств нет. Насчет портов — кому как удобнее, страница все равно в закладках браузера, и уж какой там порт прописан — лично мне без разницы. Тут я написал инструкцию как сделать, чтобы это работало. Дальнейшая настройка и кастомизация — это пожалуйста, делайте как вам нравится, я возражений не имею.
      • 0
        Это был просто хороший совет не требующий усилий.


        У устройства есть обратная связь?
        • 0
          Обратной связи нет, что печально, т.к. никогда нет гарантии, что отправленная команда была принята. Приходится для надежности делать несколько повторов (и то редко, но не доходит)
          • 0
            Примерно с полгода назад, ко мне обращался директор NooLite с просьбой сделать нечто подобное, к Вам тоже обращался?
            Ещё он говорил, что в скором времени сделают радиомодуль с обратной связью, но видимо не сделали.
            • 0
              Нет, директора nooLite я не знаю, делал чисто для себя (по началу просто хотел провести эксперимент, получится ли управлять устройством с роутера, когда получилось — довел до «юзабельного состояния», т.к. дальше все уже достаточно просто). У них на сайте есть голосовалка за новый фичи — пока обратная связь лидирует, но что-то мне подсказывает, что если этот функционал будет реализован в новой версии устройств — это существенно отразится на их цене.
              • 0
                Понятно. Однако попробуйте перевести свою систему на uhttpd, а PHP можно заменить на CGI, тогда отпадёт нужда в установке доп. пакетов.
            • 0

              https://geektimes.ru/post/242623/


              2014 год, запилено на Ноолайте, роутере TP-Link и двух ноолайтовских USB-свистках на коленке в свободное время. С тех пор работает, но из-за убогости протокола ноолайтовских модулей — работает хреново, есть как пропуски, так и ложные срабатывания.


              Причём для начала пришлось переписать все линуксовые утилиты для общения с этими свистками, ибо теоретически они были, а практически — не только не работали, но вообще несли внутри себя такой ад, что даже мне страшно было. А я не программист, так что если мне страшно от сишного кода — это о многом говорит.


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

              • 0
                Да, обратная связь бы nooLite не помешала, но я пока слабо представляю, как она может выглядеть без серьезных переделок. Я вижу 2 варианта:
                1) Обратная связь позволяет запросить у устройства его текущее состояние и получить ответ. Выключателям это не особо нужно, достаточно сделать новый USB свисток, умеющий сразу и отправлять и получать + доработать силовые блоки + доработать их роутер. Но т.к. таким функционалом люди пользуются мало — не думаю, что они будут это делать.
                2) Команды будут отправляться до тех пор, пока не будет получено подтверждение, что гарантирует доставку. На мой взгляд это самый нужный функционал. Но, во первых, придется оборудовать выключатели «хвостами» приемниками, которые испортят их внешний вид. Во вторых непонятно как будет работать подтверждение, когда один выключатель привязан к нескольким силовым блокам, и понятия об этом не имеет, ведь привязка храниться только на блоке. Придется ещё и переделывать механизм привязки.
                • 0

                  Без серьёзных — никак, у них в выключателях передатчик сделан на рассыпухе и приёмником быть не умеет.


                  Но что мешает сделать серьёзные переделки-то?


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

                  А не надо 433 МГц использовать. Есть 868 МГц, в нём печатная антенна с КПД в районе 65 % занимает площадь 15×20 мм, а есть и вовсе крохотные чип-антенны (хотя и дорогие — масштаба $0,75 штука).


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

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


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

                  • 0
                    Ну это уже будет совсем другая система, которая будет стоить совсем других денег.

                    Впринципе и сейчас уже можно обойтись без обратной связи, используя сервер с приемником и передатчиком. У сервера будет философия простая — ему не надо знать текущее состояние каждого блока, ему достаточно знать в каком состояни должен быть каждый блок. И он постоянно (с какой-то периодичностью) будет посылыть всем блокам их состояния — рано или поздно каждый блок его примет, даже если будут осечки. Соответственно все выключатели будут завязаны на приемник этого же сервера, который получив сигнал от выключателя — поменяет у себя в хранилище состояние соответствующего блока на нужное и продолжит рассылать команды. Тогда останется вариант, что не всегда может доходить сигнал от выключателя до сервера, но зато вся автоматизация и управление со смартфона будет работать как часы.
                    • 0
                      Ну это уже будет совсем другая система, которая будет стоить совсем других денег

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


                      И он постоянно (с какой-то периодичностью) будет посылыть всем блокам их состояния — рано или поздно каждый блок его примет, даже если будут осечки

                      То есть, если у меня свет в сортире после нажатия кнопки не включился, мне надо просто пару-тройку минут посидеть в темноте в ожидании, когда он, может быть, всё же сработает?


                      Плохая идея, прямо скажу.

                      • 0
                        Так я и говорю, с кнопками — проблема остается, худо-бедно гарантия появляется только при автоматизации или управления со смартфона (и да возможны задержки).

                        А вообще, после того, как я заменил лампочки на диодные, я посчитал потребление всей квартиры при свете включенном везде и вышло меньше 100 ватт. Раньше столько потребляла одна лампочка — теперь все. Поэтому я больше не замораиваюсь с выключением света. Нет, выключатели я все равно сделал, но ещё есть один общий — при входе в квартиру — включить/выключить свет везде. Именно им я и пользуюсь. ради 100-150 рублей в месяц нет смысла от всей этой экономии, зато как приятно идти по квартире, где всегда светло. Автоматика только помогает просыпаться с утра плавно включая свет, задоно вырубает свет на кухне после десяти вечера, а то занавески зеленые и свет начинает очень привлекать тлю. Ну и прочие мелочи, которые легко автоматизировать.
                        • 0
                          Так я и говорю, с кнопками — проблема остается, худо-бедно гарантия появляется только при автоматизации или управления со смартфона (и да возможны задержки)

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


                          Именно им я и пользуюсь. ради 100-150 рублей в месяц нет смысла от всей этой экономии, зато как приятно идти по квартире, где всегда светло

                          Это всё здорово, пока вы в квартире один живёте.

                          • 0
                            Это всё здорово, пока вы в квартире один живёте.

                            Количество проживающих тут роли не играет. Светло будет всем одинаково. Играет роль количество прописанных :)

                            Хотя, нет, это только для средней нормы. По счеткику это тоже не важно.
                            • 0
                              Светло будет всем одинаково

                              Особенно приятно от этого будет тем, кто лёг спать.

                              • 0
                                Для таких случаев как раз и сделаны отдельные выключатели. И если человек приходит домой поздно, и зная, что все уже спят, включает свет во всем доме — это уже вопрос скорей не технический, а клинический.
                                • 0

                                  Живёте вы действительно один.


                                  Человек, пришедший домой, ещё не знает, спит или не спит кто-либо ещё. Или смотрит кино, а потому не хочет свет во всей квартире. Или просто не хочет свет во всей квартире. Или ещё что-то.


                                  Поэтому человек, пришедший домой, если он живёт не один, просто не включает свет во всей квартире. Никогда.


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

                                  • 0
                                    Я думаю, что мы сойдемся на том, что у каждого этот момент индивидуален. Кому-то нравится когда свет включен везде. Кому-то нет. В большинстве случаев всеми движет желание сэкономить и привычка уходя откда-то гасить свет. Я на практике убедился, что отучить женщину постоянно выключать везде свет — трудно, но можно :) Естественно не надо доводить все это до абсурда, и систему надо настраивать так, чтобы удобно было всем. Если человек спит, то в спальне, которая легко исключается из общего выключателя, как и детская комната, при наличии детей. Лично я переживу, если те люди, которые спят у меня в туалете, в ванной, в коридоре и на кухне останутся недовольны. Ввиду малого их количества. Ноль человек.
          • 0
            Несколько повторов делаете нажатием на кнопку в веб-интерфейсе? Или этот повтор уже сделан программно?

            Почему спрашиваю…
            У меня подобное управление освещением тоже сделано на роутере, так же стоит вебморда, которая посылает команды НО! на ардуинку через ENC28J60, а она в свою очередь делает несколько повторов команды включения/выключения. Я просто программно сделал, чтоб было 15 повторов. С тех пор нареканий не было, всё срабатывает с первого раза.
            • 0
              С каким интервалом делаете повторы?
              • 0
                15 повторов в течение 0.5 секунды
      • 0
        «Левым» устройством может оказаться любой «свой» комп, на котором, например, «случайно» запустился JavaScript со странного сайта, который может таким образом шарить по внутренней сетке.
        • +2
          И он случайно знает адрес и порт куда лезть, а также название страниц и параметров которые надо передать, для того чтобы выключить мне свет в туалете в самый неподходящий момент. Хм… ладно, убедили, авторизация нужна!
          • 0
            Просто, в Вашем случае это свет в туалете, а в чьем-то — ворота в гараж. С учетом того, как быстро развивается IoT, проблем с подбором параметра не возникнет, мне кажется.
            • 0
              Абсолютно согласен. Но для каждой задачи свои подходы к безопасности. Во первых, сама по себе система nooLite не безопасна и можно легко перехватить отправляемые команды и получить управление без всяких авторизаций. Я бы в жизни не поставил её на ворота. Во вторых, я здесь привел пример простой системы и показал как это может работать, при этом нахождение её во внутренней сети обеспечивает достаточную безопасность начального уровня. Я ни в ком случае не утверждаю, что надо взять и по моей инструкци поставить все это на режимный объект. Это все можно (и в определенных случаях нужно) дорабатывать, и как это сделать полно статей, инструкций и документации в сети. Лично мне для домашенего пользования достаточно того, что я выложил здесь, и я не вижу смысла усложнять статью вещами, которые больше относятся к администрированию веб-сервера, чем к сабжу.
  • 0
    Небольшой «инсайд» от Ноотехники: в сентябре обещают долгожданный блок с обратной связью, шифрованием AES-128, совместим со старыми пультами. А так же будут приёмо-передатчики USB и UART то же совместимые и со старыми и с новыми Блоками.
    • 0
      Черт, менять все блоки придется :) Ну хоть пульты останутся :)

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