Подвернулись мне тут абсолютно случайно несколько штук таких извещателей. Открываем паспорт, читаем - ИЗВЕЩАТЕЛЬ ПОЖАРНЫЙ ДЫМОВОЙ ОПТИКО-ЭЛЕКТРОННЫЙ АВТОНОМНЫЙ ИП 212-50М2. Производством занимается Группа Компаний «Рубеж» ООО «КБ Пожарной Автоматики».

Вещь с одной стороны полезная, предупредит звуком сирены о задымлении помещения. Но с другой стороны и столь же бестолковая, так, как никаких других коммуникаций с пользователем, кроме, как громко орать сиреной, не предусмотрено. И если вы не рядом, то и ничего не услышите. Хотя надо отдать должное производителю, кричит она очень громко.
Итак, принято решение, самостоятельно доработать этот извещатель - сделать его умным, чтобы можно было его интегрировать в систему Умного Дома. Протокол выбираем Zigbee.
Только хочу сразу предупредить, автор не настоящий сварщик, это у него хобби.
Итак, разбираем и смотрим, что и как у заводского датчика сделано и как он работает.
В названии присутствует слово "автономный". Это значит, что питается он не от сети, а от батарейки. В нашем случае, это 9 вольтовая батарейка типа "Крона".
Сердцем извещателя является система фото и свето диодов. Один передает, другой принимает. При задымлении что-то в приемопередаче изменяется и происходит сработка.

Идем дальше. На плате извещателя нас будут интересовать всего три контакта.

-
Контакт с обозначением 1 - +9 вольт.
-
Контакт с обозначением 2 - GND.
-
Контакт с обозначением К1 - на нем при обнаружении задымления появляется меандр амплитудой 5 вольт и частотой примерно 2.5 кГц.

В качестве компонента Zigbee выбираем модуль фирмы E-Byte E180-Z5812SP изготовленный на чипе фирмы Telink TLSR8258. Модуль хорошо зарекомендовал себя в других моих проектах (Watermeter, ElectricityMeter).
Модуль Zigbee питается от 3.3 вольт. Так как на плате извещателя такого напряжения нет, нужен преобразователь питания с 9 вольт на 3.3. И желательно, чтобы сам преобразователь был с низким потреблением, все-таки устройство у нас на батарейках. Выбор пал на HT7133-1 с максимальным током 100 мА и входным напряжением от 5 до 30 вольт. Вопрос с питанием решен.
Остается пара вопросов.
Первый - преобразовать меандр в постоянный сигнал уровнем не более 3.3 вольта. За основу берем вот такую схему

-
VD1 - обычный кремниевый маломощный диод.
-
R6-R5 - делитель напряжения. R5 - подтягивающий резистор на землю самого чипа TLSR8258.
-
С1 - сглаживающий конденсатор.
Второй вопрос. Как-то нужно контролировать разряд батареи. Для этого тоже понадобится делитель напряжения с коэффициэнтом 1 к 3. Но сделать постоянно подключенный делитель нельзя все из-за того же автономного питания - лишний расход батарейки, лишние 30мкА. Поэтому нужно предусмотреть, чтобы делитель подключался только в момент измерения. Сообщество подсказало схему такого делителя.

Теперь изучим корпус на предмет дополнительных функций. И обнаруживаем, что на донышке с обеих сторон (внутренней и внешней) есть такие толкатели, которые выпирают примерно на 2 мм с каждой стороны.


При этом, если поставить на место крепежную пластину, то она нажимает толкатель и он уходит вглубь корпуса примерно на 2 мм. Это можно использовать для сигнала TAMPER. Tamper - это когда устройство не на месте, сдвинуто, отвалилось, перевернулось, т.е. находится не том положении, в котором обязано работать.
Итак, подведем итог, что мы будем контролировать и передавать в сеть.
-
Напряжение на батарейке в mV.
-
Уроверь заряда батарейки в процентах.
-
Посылать оповещение при обнаружении задымления.
-
Посылать оповещение при обнаружении, что устройство отсоединено от крепежной пластины.
-
Посылать команду при обнаружении задымления - чтобы можно было что-то включить или выключить.
Итак, мы уже немного понимаем, чего хотим от устройства и можем приступить к проектирования электрической схемы.
Для начала, нужно посчитать количество GPIO, которые нам понадобятся.
-
Кнопка управления.
-
Светодиод режимов работы устройства.
-
Включение делителя для измерения напряжения на батарейке.
-
Собственно само измерение батарейки.
-
Контроль TAMPER.
-
Ну и конечно контроль сработки при обнаружении задымления.
-
SWS - для загрузки прошивки.
-
RESET - для возможности перезапустить модуль.
-
TXD - для вывода отладочной информации через COM порт.
Итого получается нам нужно 9 GPIO. Модуль E180-Z5812SP имеет нужное их количество.

Для создания схемы и платы я использую программу EasyEda. В результате известных параметров получаем вот такую принципиальную схему устройства.

В общем схема готова, нужно прикинуть размер, расположение и крепеж платы. Идеальное место нашлось на продольной боковой стенке батареечного отсека.

Но прежде чем разводить и заказывать плату, нужно подготовить программное обеспечение. Смысл заказывать плату, если программа не заработает, как нужно.
Для тестирования берем Dev-Board совместной разработки.

Спасибо Олегу, в свое время он мне прислал их несколько штук.
Итак, возвращаемся к программе. Ранее я специально для таких случаев создал шаблон для упрощения создания Zigbee End Device устройств на TLSR8258. Берем его за основу и просто немного модифицируем согласно нашим потребностям. Для начала нужно определиться, какие кластеры Zigbee мы будем использовать.
Power configuration. У этого кластера нас будут интересовать всего два атрибута
-
BatteryVoltage - значение может быть от 0x00 до 0xFF. Единица измерения 100 mV.
-
BatteryPercentageRemaining - значение может быть от 0x00 до 0xFF. При этом там не прямая зависимоть, т.е. 100 - это не 100%. Там так - 0x00 = 0%, 0x64 = 50% и 0xC8 = 100%. Если значение будет равно 0xFF - ошибка измерения (упрощенно)
IAS Zone. Это как раз кластер оповещения. Нас будут интересовать следующие атрибуты
-
ZoneType - атрибут определяет тип сенсора. У нас будет 0x0028 - Fire sensor.
-
ZoneStatus - атрибут состояния сенсора и его элементов. Нас будут интересовать следующие статусы
-
Alarm1 - собственно это и есть оповещение о задымлении.
-
Tamper - оповещение, если извещатель отсоединили от крепежной пластины.
-
Battery - оповещение о низком уровне заряда батареи.
-
Test - просто для теста, будет срабатывать при нажатии кнопки на плате устройства.
-
-
OnOff. Этот кластер будет отправлять команду при обнаружении задымлении в зависимости от настроек
-
On
-
Off
-
Toggle
-
-
OnOff Switch Configuration. Кластер позволит настроить команды, отправляемые при обнаружении задымления.
-
On-Off
-
Off-On
-
Toggle
-
Небольшой нюанс. Для сигнала Tamper лучше использовать микропереключатель NC, так ток утечки будет меньше, чем при использовании переключателя NO. Но! NC встречаются в продаже значительно реже. Я нашел на Али, но китаец, у которого числились и NC, и NO, прислал мне все равно NO. Потому, будет два файла прошивки. С NO и с NC на всякий случай.
Итак, программа написана и проверена на Dev-Board. Нужно отметить, что мы применили абсолютно стандартные методы с точки зрения ZCL. Никаких "кастомных" атрибутов и кластеров. Что это дает? Большинство Хабов Zigbee многие стандартные кластеры умеют из коробки. Это означает, что устройство без проблем заработает во многих системах. Например zigbee2mqqt корректно работает и отображает это устройство безо всякого внешнего конвертора.
Теперь можно приступить к проектированию платы.


Отправляем gerber файл одному китайцу и через 10 дней платы у нас.


Плата готова, паяем на ней все нужные элементы. И получаем вот такую картинку.


Закрепляем плату на донышке корпуса извещателя.


Для этого нужно немного убрать пластика в позиции 1. Легко делается обычными кусачками. Потом совмещаем микропереключатель с толкателем (позиция 3), проверяем, что нажатие происходит корректно и толкатель не уходит в сторону от штока переключателя на всем диапазоне нажатия. И после этого сверлом 1.8 мм сверху (стрелочки с номером 2) намечаем отверстия на корпусе. Далее рассверливаем их до диаметра 2.4 мм и раззеньковываем с обратной стороны корпуса 5 мм сверлом. И крепим это все двумя потайными саморезами M2.2x9.5 мм.


На третье отвертие не обращайте внимания. Это я экспериментировал с большим по длине кронштейном.
Дальше нужно немного доработать оригинальную плату извещателя. Так как мы заняли своей платой + кронштейном некоторое пространство, то оригинальная плата не встает на место. Мешает небольшая "бобышка" - скорей всего это какая-то катушка.

Нужно ее просто отпаять, удлинить выводы и припаять, чтобы корпус был вынесен за пределы платы.

Теперь все встает на место. Можно монтировать и проверять.

Ну а дальше нужно это все как-то подключить к Умному Дому. В качестве последнего у меня работает Home Assistant. В свое время я не захотел стать заложником какой-то одной фирмы. Ведь не секрет, что устройство одной компании совершенно не факт, что заработает с Хабом другой компании. Именно поэтому я выбрал такую схему - в качестве координатора у меня просто Стик Zigbee, а в качестве шлюза я использую zigbee2mqtt (установленный в Home Assistant в качестве Аддона). Почему я выбрал zigbee2mqtt? Все просто. К zigbee2mqtt можно подключить абсолютно неизвестное ему устройство, написав внешний конвертор, и он будет прекрасно с ним работать.
Повторюсь, zigbee2mqtt работает с устройством безо всяких конверторов, но чтобы было все красиво, чтобы была "иконка" устройства, конвертор все же мы напишем. И после этого устройство будет выглядеть в Web-интерфейсе zigbee2mqtt вот таким образом


Идем во вкладку Exposes. Там так.

Home Assistant подхватывает датчик из zigbee2mqtt автоматом.

Ну и еще. Вот например Умный Дом Яндекс. Из коробки основные параметры показывает без проблем.

P.S. Если кто-то захочет повторить приведу несколько ссылок.
-
Если кто-то захочет получить помощь в разработке Zigbee устройств, есть Телеграм чат, где как раз общаются по этой теме.
Автор: Slacky1965