Contents
Введение:
В данной статье будет рассмотрен вариант интеграции обычного автономного пожарного извещателя (датчика дыма) в систему Majordomo. Будем использовать вывод пожарного извещателя на котором при его сработке появляется напряжение равное напряжению питанию (обычно данный вывод используется для работы таких извещателей в шлейфе при проводном подключении). Отслеживать состояние этого вывода (через делитель напряжения) будем при помощи Wi-Fi микроконтроллера ESP8266. Далее по протоколу MQTT информация будет доставляться в систему умного дома MajorDoMo и обрабатываться при помощи Простых Устройств. Для получения более подробной картины, пожарный извещатель дополнен температурным сенсором.
Компоненты:
В системе будут использованы следующие компоненты:
- Автономный пожарный извещатель.
- Wi-fi микроконтроллер на базе ESP8266.
- Источник питания 5в 1A
- Литий ионный аккумулятор 18650
- плата защиты и зарядки Li-ion 1S на TP4050
- Несколько диодов Шоттки для развязки аккумуляторного и сетевого питания
- Повышающий DC-DC преобразователь MT3608 для питания извещателя
- Понижающий DC-DC преобразователь Mini-360 DC для питания ESP8266
- Датчик температуры DS18B20.
- Алюминиевый корпус и внешняя Wi-Fi антенна (в моем случае)
Схема подключения и принцип работы:
Напряжение от источника питания 5в поступает на плату зарядки (TP4050) и через диод Шоттки на вход повышающего преобразователя (MT3608). На этот же вход, тоже через диод Шоттки поступает напряжение с выхода платы TP4050, только его величина уже равна напряжению на аккумуляторе. А так, как оно всегда меньше 5в (максимум 4,2), то при наличии питания от сети на вход повышающего преобразователя будет поступать питание от сетевого источника питания (5В), а при пропадании — моментально будет задействован аккумулятор. Практика показывает бесперебойность питания при таких переключениях. С выхода MT3608 напряжение, величиной в 10 вольт поступает на вход питания пожарного извещателя и на DC-DC преобразователь MINI-360, который нужен для формирования 5в напряжения питания платы D1-Mini и для фантомного питания термодатчика DS18B20. Для контроля наличия сетевого питания, напряжение с источника питания подается на вход D1-Mini GPIO-14 (D5) через делитель напряжения. Для контроля уровня заряда аккумулятора, напряжение с платы зарядки через делитель напряжения подается на аналоговый вход A0 (ADC0) платы D1-Mini.
С питанием разобрались. Теперь сигнальные линии. Выход аварии с пожарного извещателя через резистивный делитель подключен ко входу GPIO-13 (D7) платы D1-Mini. А сигнальный вывод термодатчика DS18B20 подключен ко входу GPIO-5 (D1) платы D1 Mini. К нему же через резистор 4,7к подается напряжение 5В для обеспечения паразитного питания датчика.
Конструкция:
Температурный датчик размещен в корпусе пожарного извещателя, а все остальные компоненты разместились в алюминиевом корпусе от сгоревшего светодиодного драйвера. Т.к. корпус алюминиевый, для уверенного приема Wi-Fi, к ESP8266 пришлось подключить внешнюю антенну. Пожарный извещатель и корпус со всеми остальными компонентами соединен четырьмя проводами.
Прошивка ESP8266:
Использован проект WiFi-iot.com На скриншоте ниже отмечены необходимые опции. Подробности прошивки модуля можно узнать из статьи про MQTT, с тем лишь исключением, что для платы D1-Mini не нужен внешний USB-UART, она имеет таковой уже на борту и подключается просто к USB.
После прошивки и подключения к Wi-Fi (это произойдет автоматически, если в конструкторе были заданы «Настройки по умолчанию») необходимо настроить модуль. Для начала на вкладке Main следует задать внятное имя, что бы потом его можно было просто найти в MajorDoMo, затем на закладке Hardware активировать DS18B20 (не забыть задать правильный GPIO) и аналоговый вход ADC. На закладке Servers настроить подключение к брокеру MQTT.
На вкладке GPIO настроить входы, на 1-wire отсканировать термодатчик, а на вкладке ADC активировать калибровочную таблицу и собственно ее создать (инструкцию искать на сайте wifi-iot), для того чтобы измерения АЦП (напряжение на аккумуляторе) перевести в удобоваримый вид.
Настройка MajorDoMo:
Для начала проверим передает ли наше устройство данные по MQTT. Для этого проследуем в Панель управления>Устройства>MQTT, находим там наш пожарный извещатель и видим кучу пришедших значений, к которым мы еще вернемся.
Теперь необходимо создать соответствующее Простое Устройство (ПУ), для этого идем в Панель управления > Устройства > Простые устройства. Здесь нам нужно создать 2 новых ПУ с типами: Датчик температуры и Датчик дыма. Автоматически создадутся связанные объекты, к свойствам которых нужно будет привязывать параметры полученные по MQTT от наших физических устройств.
Теперь вернемся к MQTT и привяжем получаемые данные к свойствам объектов. В первую очередь нас будут интересовать /FireSensor/input13 (сработка датчика) и /FireSensor/dsw1 (температура).
На остальные параметры так же можно настроить какую-то реакцию системы…
Оповещение:
Настройки оповещения выходят за рамки данной статьи, но она была бы не полной без описания базовых моментов. Итак, для начала необходимо настроить ПУ. Идем в Панель управления > Устройства > Простые устройства, выбираем пожарный датчик, на вкладке Настройки «Допустимое время отсутствия данных» ставим 1. Переходим на вкладку Действия, где вписываем следующий код на PHP:
if (getGlobal("Smoke01.status") == 1) {
say('сработка пожарного датчика', 2);
}
Теперь проверка доступности модуля ESP8266. Делается это посредством свойства Alive, объекта Smoke01, но для того, что бы можно было привязать какое-то действие к событию смены состояния свойства alive, необходимо добавить соответствующий метод в родительском объекте. Итак, идем в Панель управления > Объекты > SDevices и жмем кнопку редактировать, а затем на вкладке Методы добавляем новый метод AliveUpdate. Затем переходим в Свойства > Alive и в выпадающем списке «Запускать метод при изменении» выбираем AliveUpdate.
Теперь переходим в наш объект: Панель управления > Объекты > SDevices > Ssmoke > Smoke01, где на вкладке методы нажимаем кнопку «настроить» напротив метода AliveUpdate. В поле «Код» вписываем следующее:
if ($params['NEW_VALUE'] == $params['OLD_VALUE']) return;
if (getGlobal("Smoke01.alive") == 0) {
say('пожарный датчик не доступен', 2);
}
else {
say('пожарный датчик снова доступен', 2);
}
Теперь о главном 🙂 Как же эти оповещения будут приходить к вам на телефон? А вот тут вариантов масса, лично я для себя выбрал сервис Notify.Event. Необходимо в нем зарегистрироваться, создать свой канал, затем в настройках канала добавить источник нотификаций API и получить ключ API. Затем установить в MajorDoMo из маркета дополнений одноименный модуль, в настройках которого необходимо ввести полученный ключ API. И в конце-концов необходимо вернуться в панель управления на сайте Notify.Event и подписаться на свой канал любым доступным мессенджером (вайбер, телеграмм и т.п.). Таким образом, в виде оповещений будет приходить всё, что Алиса в MajorDoMo проговаривает голосом.