Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам > CyberWrt

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.05.2015, 13:44   #1
Prana
Junior Member
 
Регистрация: 17.03.2015
Сообщений: 27
Вес репутации: 0
Prana is an unknown quantity at this point
Lightbulb Re: Модуль "Light Control"

Немного о деталях реализации:

Arduino: скетч обрабатывает запросы на считывание статусов и управление нагрузками, приходящие из uart.

Демон serd: демон (приложение-сервис), исполняющийся на роутере, и отвечающий за работу с uart. Он необходим для того, чтобы сразу несколько процессов не пытались работать с портом, и не происходило конфликтов из-за параллельного доступа.

База данных sqlite: БД хранит состояния портов, которые в ней постоянно обновляются демоном. БД введена на перспективу того, чтобы в дальнейшем в нее также можно было писать логи состояний отдельных портов, и использовать для статистики/графиков.
В варианте модуля БД съедает 300Кб.

cgi-скрипты модуля: sh-скрипты, вызываемые веб-сервером и отвечающие за подготовку данных, выдаваемых клиентам.
constructor.cgi - страница настроек, читающая настройки из файла settings, и позволяющая управлять списком портов и логикой их работы (выключатель, диммер, кнопка...). По результатам работы страницы формируется новый набор settings.
generate.cgi - скрипт генерации index.cgi (основной страницы модуля), создающий страницу по настройкам из settings-файла
Остальные cgi не делают страниц, а отдают данные для ajax-запросов:
getstate.cgi - мониторит состояние запрошенного списка пинов, и отвечает клиентам обновленным состоянием. На входе принимает список пинов, и то состояние, которое уже есть у клиента (параметр old)
recover.cgi - восстанавливает старую версию index.cgi из резервной копии
switch.cgi - отправляет в порт запросы на управление выключателями, кнопками и триггером ("спусковым курком")
uart.cgi - отправляет в порт запросы на управление диммером, возвращает новое показание в %

Клиентская часть
constructor.cgi выдает страницу конфигурации, в которой можно настроить набор пинов и логику их работы.
Допускаются следующие виды элементов управления:
Выключатель (кодируется как DSxx, например, DS07): элемент, имеющий состояния ВКЛ и ВЫКЛ, висящий на 7 пине
Диммер (кодируется как DDxx): диммер, имеющий состояния от 0 до 255 (0 - выключен, 255 - полная яркость), отображающий слайдер регулировки и значение, приведенное к % от 0 до 100. Слайдер можно перемещать не только мышью, но и кнопками клавиатуры, если хочется плавности.
Кнопка (кодируется как DB) - это кнопка без фиксации. В момент нажатия в порт отправляется 1, в момент отпускания - 0. Если страница открыта на смартфоне или планшете, то полноценно кнопка работать не будет: ввиду особенностей работы браузеров на тачскрине, происходит "клик", то есть нажатие и сразу же автоматическое отпускание.
Триггер (кодируется как Db) отличается от кнопки тем, что в порт происходит отправка 1, и только в момент нажатия

Отправка сигналов управления диммером происходит через асинхронный запрос к uart.cgi. Формат - "DD13=053". В ответ возвращается значение в %, которое подставляется к слайдеру. Управление выключателями и кнопками осуществляется через асинхронный запрос к switch.cgi. Формат - "DS07=001". Для кнопки при отпускании выдается 002. Ответы при этом не обрабатываются.

Как работает считывание состояний пинов: демон serd осуществляет ежесекундный опрос пинов Arduino для получения актуального состояния. В случае изменения состояния какого-либо из портов он производит его запись в БД. Благодаря этому нет никаких конфликтов в чтении порта, а к БД может обращаться хоть сотня параллельных процессов.
JavaScript на странице index.cgi создает ajax-запрос к getstate.cgi с временем ожидания ответа 30 секунд. Если ответ за это время не получен, открывается новый запрос с теми же параметрами. Если от сервера приходит ответ, то происходит изменение состояний элементов управления на странице, и снова открывается запрос к серверу.
Серверная часть getstate.cgi работает следующим образом: при получении запроса начинает ежесекундно мониториться БД по выбранным пинам. Если изменений состояния нет, то сервер не отвечает клиенту, искусственно заставляя его ждать. Если же состояние какого-то из пинов изменилось, то сервер сразу же отдает ответ клиенту.
Такой подход позволяет снизить количество запросов клиентов к серверу до двух в минуту, уменьшив как трафик, так и количество крутящихся на сервере процессов. С таким подходом и десяток клиентов не будут оказывать сколь-нибудь серьезной нагрузки на роутер. Благодаря использованию одного демона исключаются конфликты при доступе к порту. А БД в будущих версиях можно будет использовать для хранения истории состояний отедельных портов
Prana вне форума   Ответить с цитированием
Старый 15.06.2015, 11:41   #2
elik745i
Senior Member
 
Регистрация: 07.01.2015
Адрес: Baku
Сообщений: 225
Вес репутации: 0
elik745i is an unknown quantity at this point
По умолчанию Re: Модуль "Light Control"

Цитата:
Сообщение от Prana Посмотреть сообщение
Немного о деталях реализации:

Arduino: скетч обрабатывает запросы на считывание статусов и управление нагрузками, приходящие из uart.
Дмитрий, аналогичный вопрос...
elik745i вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 3 (пользователей: 0 , гостей: 3)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 04:23. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика