Умный дом на ESP8266+MajorDoMo. Часть 3. Настройка MajorDoMo.

В прошлой части мы остановились на том, что написали скрипты LUA для работы с преобразователем движения HC-SR501. Устройство получилось автономным, при срабатывании отправляло данные по UART, а также отслеживать состояние устройства можно было на поднятом веб-сервере. В этой статье привяжем устройство к MajorDoMo.

Открываем в браузере адрес сервера МДМ, заходим в панель управления.

Слева в меню выбираем пункт ОБЪЕКТЫ

MajorDoMo представляет собой систему объектно-ориентированного программирования, со всеми вытекающими, что очень удобно. У меня в планах привязать все датчики движения, температуры, влажности, давления и т.д. к беспроводной связи, т.е. к ESP8266. Поэтому для начала создадим класс с названием «ESP8266», общий для всех чипов ESP без привязки к конкретным данным датчиков.

После добавления класса добавим несколько общих свойств для каждого из всех ESP8266. Я пока что решил, что необходимый минимум — это 4 свойства: IP-адрес, уровень сигнала, количество свободной памяти, и команда-ping. Последняя под сомнением, надо ли будет. Точнее надо будет 100%, но с реализацией еще не определился, поэтому пока просто оставил свойство. Все эти свойства выходят за пределы данной статьи, так что все они останутся нереализованными, просто висеть в воздухе. В дальнейших статьях они будут добавлены.

Переходим в пункт «Свойства» созданного класса, нажимаем кнопку «Добавить новое свойство».

И поочередно добавляем вышеперечисленные 4 свойства, как на картинках ниже.

В конечном итоге все будет выглядеть так:

Общий класс для всех ESP8266 создан. Теперь создадим обобщенный класс для преобразователей движения HC-SR501. Опять заходим в «Объекты -> Добавить новый класс», создаем класс с названием «MotionSensor». В качестве родительского класса выбираем ранее созданный класс «ESP8266».

В классе «MotionSensor» создадим одно-единственное свойство «alarm», в которое мы будем записывать состояние преобразователя движения.

Теперь создадим метод, который будет вызываться при изменении свойства «alarm», т.е. при сработке преобразователя движения (тут будет один момент, я расскажу о нем ниже). Переходим на вкладку «Методы», нажимаем кнопку «Добавить новый метод». Вводим название метода, описание. После добавления метода откроются расширенные настройки, как на рисунке ниже.

При срабатывании преобразователя движения чип ESP8266 установит значение свойства «alarm» в «1». После обработки этого события нам нужно вернуть его в «0», что мы и делаем методом выше.

В конечном итоге вид класса «MotionSensor» будет выглядеть так:

Все, два общих класса созданы, теперь можно создать непосредственно объект. В классе «MotionSensor» создадим объект «KitchenHCSR501» (преобразователь движения HCSR501, расположенный на кухне). В качестве месторасположения соответственно выберем кухню)

Объект «KitchenHCSR501» обладает всеми свойствами и методами классов «ESP8266» и «MotionSensor», т.к. унаследован от них. Соответственно у него будет свойство «alarm» и метод «MethodAlarm». Метод, созданный ранее может только устанавливать свойство «alarm» в «0», а нам нужно что-то более динамичное. Сделаем так, чтобы при сработке датчика движения (т.е. при установке свойства «alarm» в «1») Алиса произносила голосом, что датчик сработал. Для этого выбираем пункт «Методы» в объекте «KitchenHCSR501», и нажимаем кнопку «Настроить».

Теперь после выполнения родительского метода (установки свойства «alarm» в «0») Алиса произнесет голосом о проникновении в святая святых. Точнее сделает это после назначения этого метода изменению свойства «alarm». Переходим в свойства класса «MotionSensor», выбираем свойство «alarm», и в пункте «Запускать метод при изменении (не обязательно)» выбираем наш метод «MethodAlarm», сохраняемся.

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

Во главе всего у нас стоит класс «ESP8266» с 4 свойствами, которые не отвечают за показания датчиков, а служат только для проверки работоспособности самих чипов (в данной статье не реализованы). От этого класса наследуется класс «MotionSensor», который имеет еще одно дополнительное свойство, отвечающее за статус преобразователя движения. Классов, подобному этому, может быть несколько. Например TemperatureSensor (отвечающий за вывод/регулирование температуры), HumiditySensor (отвечающий за вывод/регулирование влажности), и т.д. Каждый новый класс будет иметь свои свойства, которые присущи только ему (температурный класс — имеет свойство температуры, влажностный — влажности).

Самым последним идет объект — так сказать физическая реализация всех этих классов. У нас это «KitchenHCSR501» — преобразователь движения HCSR501, установленный на кухне. Объектов тоже может быть несколько, например «HallHCSR501» — преобразователь движения, установленный в прихожей. Но у всех будет свойство «alarm» — сработка датчика, т.к. все они будут унаследованы от класса «MotionSensor».

Как же это работает?

MajorDoMo — прекрасный фреймворк для создания умного дома. Получение/установку свойств, вызов методов и прочее можно производить как из командной строки, так и HTTP-запросами. На последних мы и реализуем весь функционал. На странице «Интеграция сторонних программ и сервисов» написано, как именно через http можно брать значение свойства объекта или устанавливать новое.

Вернемся к нашим баранам. У нас есть объект «KitchenHCSR501» со свойством «alarm». При установке данного свойства в «1» вызывается метод «MethodAlarm», который заставит Алису сообщить о проникновении на территорию. На самом деле метод «MethodAlarm» будет вызываться при любом изменении значения, но чип ESP8266 из прошлой части будет его устанавливать только в «1», а сбрасывать в «0» мы будем в самом методе.

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

http://192.168.1.15/objects/?object=KitchenHCSR501&op=set&p=alarm&v=1

Тут мы как раз и устанавливаем свойство «alarm» объекта «KitchenHCSR501» в «1». При этом MajorDoMo у нас находится по адресу 192.168.1.15. Нажав ENTER мы увидим в текущем окне ответ «ОК», что говорит о удачном выполнении запроса.

Алиса в свою очередь голосом уведомит нас, что датчик сработал, и запишет это в истории сообщений

Данный запрос выполняет чип ESP8266 из прошлой части, при срабатывании датчика движения.

За это отвечает функция «alarmMotion()» в файле «main.lua»:

 -- Отправка данных о тревоге на сервер MajorDoMo
 local function alarmMotion()
 print("АЛЯРМА!!!")  -- печатаем сообщение о тревоге
 srv = net.createConnection(net.TCP, 0)  -- создаем новое TCP-соединение
 srv:connect(81,"192.168.1.15")          -- коннектимся к серверу с установленным MajorDoMo
 srv:on("connection", function(sck, c)   -- если соединение установлено, отправляем данные на сервер
 sck:send("GET /objects/?object=KitchenHCSR501&op=set&p=alarm&v=1 HTTP/1.1\r\nHost: 192.168.1.15\r\nConnection: keep-alive\r\nAccept: */*\r\n\r\n")
 end)
 end

В 7-й строке можно увидеть наш запрос на установку свойства в «1».

Продолжение следует…

Комментарии 4

  • Если на ESP поднимать сервер есть ли возможность подключения нескольких устройств?

  • Не понял вопроса. Подключения к чему?

  • К ESP, точно также как к домашнему роутеру)

  • Все зависит от того, чем именно ты хочешь напичкать сам ESP ))) Если у него хватит ресурсов — почему нет? Несколько устройств без проблем подключатся к веб-серверу ESP.

Добавить комментарий для prudnikov-1994 Отменить ответ

Ваш адрес email не будет опубликован.

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.