Управление светом через браузер

    Мы написали веб-приложение для управления освещением при помощи системы NooLite.

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

    Демо (вместо включения/выключения света в демо-режиме выдается текстовое сообщение о выполнении действий).

    Мы использовали ASP.NET MVC на стороне сервера, JQuery Mobile на клиенте (собственно, в первую очередь интересно было управлять освещением именно с телефона). СУБД не требуется (настройки хранятся в конфигурационном файле). Для отправки команд с компьютера на управляющие блоки используется USB-адаптер PC118.

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

    Под катом находится инструкция по установке и настройке «с нуля».

    Устанавливаем необходимые компоненты



    Настраиваем web-сервер (IIS Express)


    1. Скачиваем архив с веб-приложением отсюда и распаковываем, например, в папку «C:\noolite».
    2. Запускаем IIS Express (файл C:\Program Files\IIS Express\iisexpress.exe), чтобы он создал конфиги по умолчанию.
    3. Создаем в настройках IIS запись о новом сайте. Для этого в командной строке набираем
    cd C:\Program Files\IIS Express
    appcmd add site /name:noolite.web /bindings:"http://%COMPUTERNAME%:19777,http://localhost:19777" /physicalPath:C:\noolite
    

    4. Устанавливаем ApplicationPool для сайта
    appcmd set app "noolite.web/" /applicationPool:Clr4IntegratedAppPool
    

    5. Запускаем IIS Express
    iisexpress /site:noolite.web

    Теперь если набрать в браузере «localhost:19777», должна открыться примерно такая страничка:



    Настраиваем управление светом


    Настройки приложения, имеющие отношение к управлению электроприборами, находятся в файле NooLite.config в корневой папке сайта. По умолчанию этот файл содержит тестовые данные:

    <?xml version="1.0" encoding="utf-8"?>
    <nooLiteConfiguration debug="false">
      <page id="bedroom" title="Спальня" description="Общий свет и настенные светильники в спальне">
        <control id="main" displayText="Общий свет" type="Switcher" level="155">
          <channel id="0" />
        </control>
        <control id="night-light" displayText="Ночник" type="Slider">
          <channel id="0" level="0" />
          <channel id="1" />
        </control>
        <control id="all-off" displayText="Выключить все" level="0">
          <channel id="0" />
          <channel id="1" />
        </control>
      </page>
      <page id="hallway" title="Коридор">
        <control id="main" displayText="Возле выхода" type="Switcher">
          <channel id="2" />
        </control>
        <control id="small" displayText="Возле кухни" type="Switcher">
          <channel id="3" />
        </control>
        <control id="all-off" displayText="Весь коридор" type="Switcher">
          <channel id="2" />
          <channel id="3" />
        </control>
      </page>
    </nooLiteConfiguration>
    


    USB-адаптер PC118 имеет 8 каналов, каждый из которых можно связать с группой светильников (или других электроприборов).

    Внутри корневого элемента nooLiteConfiguration содержится коллекция элементов page. Каждый из них описывает отдельную страницу приложения. Элемент page имеет параметры id (идентификатор страницы, используется при формировании ее адреса), title (заголовок страницы) и description (описание, отображается на странице сверху).

    Внутри каждого элемента page находится несколько элементов control. Они задают набор элементов управления на странице. Элемент control имеет параметры id (идентификатор элемента управления), displayText (текстовая метка), type (тип элемента управления) и level (уровень яркости, который будет устанавливаться для светильников при использовании данного элемента управления, например, при нажатии на кнопку).

    Параметр type может принимать одно из следующих значений:
    • Button — кнопка, которая устанавливает светильникам уровень яркости, заданный в параметре level;
    • Switcher — группа из двух кнопок: «ON» и «OFF». Кнопка «ON» работает аналогично элементу «Button», кнопка «OFF» выключает свет во всех связанных каналах;
    • Slider — слайдер и кнопка «SET», которая устанавливает в указанной группе каналов уровень яркости, выбранный при помощи слайдера.


    Внутри каждого элемента control можно указать набор каналов (элемент channel) в которые нужно отправлять команды при использовании данного элемента управления. Канал имеет параметры id (номер канала — число от 0 до 7) и level (уровень яркости для канала — имеет приоритет над значением параметра level у элемента управления).

    Ниже приведен пример отображения элементов управления для страницы «bedroom» из набора тестовых данных.



    Вместо заключения


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

    Когда я в первый раз узнал о «белорусской компании, которая разрабатывает радиоуправляемые выключатели», мне вспомнилась история про мониторы «ИНТЕГРАЛ», посмеялся и забыл об этом. Но после обзора системы NooLite на хабре я заказал себе пару таких выключателей и это оказалось очень клево. Я думаю, подобные вещи и люди, которые их создают, делают наш мир лучше. Они показывают нам, что будущее, о котором мы могли только мечтать в детстве, уже очень близко — намного ближе, чем мы думаем.

    Я очень хотел бы, чтобы система NooLite и другие подобные проекты развивались и входили в нашу жизнь. Именно поэтому я потратил выходные на управление светом через броузер. И я готов еще потратить свое время на реализацию подобных задач.

    Спасибо за внимание!
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 22

      0
      <оффтоп>У вас с UI проблема, on/off реализуется чекбоксом/айфоновским свичером, 2 кнопки для этой задачи не нужны.</оффтоп>
        +7
        Чекбокс не только переключает что-то между двумя состояниями, но и отображает, в каком состоянии он сейчас находится.
        Т.к. нет возможности узнать состояние нагрузки, пришлось сделать две кнопки (кнопки только выполняют действие, но не отображают состояние).

        Т.е., например, если Вы включите свет из приложения, а потом выключите с выключателя, то приложение не сможет узнать об этом и изменить состояние переключателя на «выключен».
          0
          Тогда понятно. Спасибо.
            0
            Если уж не отображает состояние, тогда в чем было проблема сделать одну кнопку On/Off? :) По аналогии с toggle
              0
              Не думал, что есть большая разница с двумя кнопками. Если хотите, могу добавить.
                –1
                Прислушивайтесь к тому что говорят другие, как удобно большинству, и двигайтесь в этом направлении, если вы конечно хотите сделать полезный продукт для людей, а не просто для себя. Для себя можно много чего упростить и много на что забить.
                  +1
                  Не слушайте никого. У меня две кнопки, потому что удобно. Не думать «так, вторая лампа выключена, поэтому если я нажму on-off, она включится», а просто нажать включить. А если я в другой комнате, и не вижу, какая из двух ламп выключена, а какая включена?
                    +1
                    Скорее всего будет удобнее сгрупировать эти две кнопки в одну с разделителем по середине. Это решит обе проблемы:
                    а. Элементы логически сгруппированы как в чекбоксе
                    б. Принцип работы не подразумевает отслеживания текущего состояния.

                    В принципе не могу понять зачем мне в таком функционале toggle — я хочу либо включить свет, либо выключить, но не «сделать наоборот»
              0
              Спасибо за обзор. Тоже давно хочу иметь онлайн доступ ко всем электроприборам дома, интересный проект.
                0
                Персонально для меня главное препятствие в реализации всего этого — единственный провайдер, который есть в доме. Очень долго и безуспешно пытаюсь добиться от него хотя бы динамического белого IP.
                  0
                  VPS снаружи с белым IP и OpenVPN до него не?
                    0
                    Никто не спорит, что можно. Гланды тоже можно удалять через одно место.
                    С другой стороны, собственный сервер тоже нужен, но меня откровенно не прельщает необходимость лишнего звена.
                +3
                Это надо на вооон той железке, мирно жужжащей в углу в роли NAS'а, ставить винду и иис только ради того, чтобы выключить свет?
                  +1
                  Ну, например, у меня на кухне постоянно включен ноутбук с виндой. Он качает торренты + жена на нем смотрит фильмы в фоновом режиме. Соответственно, включением/выключением света у меня тоже он занимается. Думаю, не только у меня дома постоянно включен полноценный компьютер.

                  А вообще, в планах попробовать запустить этот сайт на linux (примерно так). Думаю, с веб-мордой проблем не будет (ничего специфического из винды там не используется). Возможно будут трудности с отправкой команд адаптеру через USB.
                    +1
                    Если уж пошла такая пьянка, неплохо было бы стандартизировать команды web-api, чтобы клиент не зависел от сервера. Мне вот не нравится веб-страничка, нативная программа лучше — ее не надо загружать и запускается быстрее.

                    У меня сейчас вот так: api.php?channel=1&command=set&level=10
                      0
                      У меня вот так:
                      Home/Command?page=bedroom&control=main&level=155&strong=false

                      page — идентификатор страницы (задается в конфиге);
                      control — идентификатор элемента управления (задается в конфиге);
                      level — уровень яркости;
                      strong — логическое значение, которое определяет приоритет параметра level над уровнем яркости, заданным в конфиге.

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

                      Такой подход удобен, если нужно по нажатию одной кнопки, например, выключить основной свет и включить ночник на заданную яркость. Действия в каналах настраиваются в конфигурационном файле, а с клиента на сервер отправляется только один запрос.
                  0
                  Демо-приложение не работает. Нажимаю включить свет — не включается :(
                  Подозреваю, придется идти к выключателю пешком как обычно!
                    0
                    Так там же и написано, что это только демонстрация интерфейса и реальных действий над электроприборами оно не выполняет.
                    Вместо этого должны выдаваться текстовые сообщения, чтобы можно было понять, какая кнопка — что делает.
                      0
                      Как же тогда убедиться в том, что приложение 1) вообще работает 2) работает для конкретного пользователя?
                        0
                        Скачать его, установить и попробовать в работе.
                        Когда оно работает на удаленном сервере, в любом случае, трудно понять, включает ли оно в реальности свет. :)
                    0
                    Вот скажите, зачем делать велосипеды, если можно взять готовую систему (OpenRemote, OpenHAB, etc) и написать под нее плагин?
                    А там сразу и веб-интерфейс, и мобильный появятся?
                      0
                      Этот велосипед значительно проще в установке и настройке. Если нужны большие возможности, то удобнее взять сложную систему. А если нужно просто управление светом и легкая настройка, то лучше взять подобный велосипед.

                    Only users with full accounts can post comments. Log in, please.