Как купить девайс для умного дома и попасть в команду разработчиков (часть 2)

Часть 1 здесь

8bd933aabbec674a5778d1baf5ff2c6f.jpg

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

Кот — неудавшийся самоубийца.

Сам привод, несмотря на то, что он выполняет всего две функции: открыть и закрыть, содержит в себе довольно развитую логику управления. Например, при начальной настройке пользователь устанавливает уровень защиты открытия и закрытия. И если в процессе открытия или закрытия усилие превышает этот, установленный уровень, привод  останавливается и откатывается обратно.  Таким образом организована защита от случайного защемления, например пальцев.

И вот однажды, пользователь в чате обращается с просьбой –, а можно ли увеличить процент отката после защемления? Выясняется следующее. Окно было открыто. Любопытный кот, сидя на подоконнике, высунул голову в щель. Окно начало закрываться. По какой-то причине кот продолжал сидеть. Привод обнаружил наличие помехи, отъехал назад, но недостаточно для того, чтобы кот смог вытащить голову. И какое-то время, кот так и сидел с головой на улице, ругая кошачьими ругательствами злых хозяев, не очень умный дом и абсолютно тупое окно, которое поставило его в такое некрасивое положение.

И мы, на полном серьёзе, устроили мозговой штурм для решения этой проблемы. Победило следующее предложение: добавить в настройку выключатель «Защита кота». При активации этой функции, перед началом любого закрытия, сначала, в течении секунды, мотор работает динамиком на частоте ультразвука. Животное должно испугаться и сбежать подальше от верещащего окна. И только потом начинается процедура закрытия.

Но, оказывается, проблема решилась и без нашего участия. Коту хватило одного раза, чтобы понять, что как только окно начинает двигаться, нужно моментально свалить с подоконника, дабы не подвергать себя опасности.  Так что данная функция так и осталась нереализованной.

Рассматривая этот кейс, мы поняли, что установка уровней защиты — весьма сложная процедура для пользователя. Особенно учитывая, что привод может двигаться с одной из четырех фиксированных скоростей — от самой низкой и практически бесшумной до самой высокой. И для каждой скорости необходимо подобрать значение уровня защиты открытия и закрытия.  Тогда я предложил сделать автокалибровку. После установки привода, пользователь нажимает кнопку в настройках, и привод, по очереди, на всех четырёх скоростях пробует открыться и закрыться. Считывает с датчика максимальный уровень усилия, добавляет к нему небольшой процент (поправку на возможный ветер), и записывает полученные значения в свою энергонезависимую память.  Данная функция была реализована и включена в ближайшее обновление.  А началось всё со слишком самоуверенного кота.

Яблоки — наше всё.

Да, я яблочник. Вся семья пользуется айфонами, дети играют на айпадах и фильмы мы смотрим на Apple TV.  Ожидаемо, что мой Умный дом построен на HomeKit.  Но привод на тот момент умел только MQTT и HTTP управление. Купил малинку, поднял mqtt брокер, HomeBridge, и прокинул через это всё.  Несколько дней радости и малинка повисла. Висла она регулярно. Это бесило. Купил к ней родной блок питания от Raspberry. Дорого, круто, но проблему не решило. Почитал форумы, нашел ответ — перегрев. Купил, приклеил радиаторы. Стало хорошо. Кинул малинку за телевизор, туда,   где была розетка.  Несколько дней — полет нормальный и опять завис. Открыл корпус — радиаторы отклеились (малинка лежала боком). Приклеил, положил горизонтально. Вроде всё стабилизировалось.  Но, будучи по профессии системным администратором, я прекрасно понимал, что для улучшения надежности необходимо уменьшение количества потенциальных точек отказа. То есть очень хотелось убрать из цепочки вот это вот всё и подключить привод напрямую в HomeKit.  Работы по этому направлению велись командой Drivent, но медленнее, чем мне хотелось бы.

fce03e74f92fdd3fd530d75b2cd4981e.jpg

Привод уже стоял на своем законном месте — на окне спальни и я занялся сборкой датчика, который мог бы измерять уровень СО2, температуру и, посредством автоматизаций в HomeKit, давать команды приводу на открытие-закрытие окна.

Франкенштейн — это не так плохо.

883ae24ef59ba9df302a32b137551d9e.jpg

И родился у меня такой монстр.  Был найден интересный проект — ESP Easy, который помог мне, без особого вникания в дебри программирования, запустить эту железку и выдать в тот же MQTT нужные мне значения — температуры, влажности и СО2.  Написал пару скриптов — переключение дневного и ночного режимов яркости экрана, вывод на экран времени восхода и захода солнца (не знаю, зачем, но прикольно).

fd85d135bc328b10249fd384e1a94c02.jpg

Ну и написал несколько автоматизаций в HomeKit, для регулировки открытия окна по этим значениям.  И вроде бы как всё начало работать так, как изначально я задумывал, но всё-таки очень хотелось избавиться от малинки. Через которую работал уже не только привод, но и мой монстр.

Добро пожаловать в семью.

Естественно я поделился фотками своего монстра и описанием принципа его работы с командой Drivent.  Устройство весьма заинтересовало.

И вот, 3 января 2021 года я получаю предложение полноценно влиться в команду разработчиков Drivent.  И, после моего согласия, меня сразу озадачили разработкой концепции и программного обеспечения датчика температуры и СО2, но уже в серьезном заводском исполнении.

Началось бурное обсуждение того, что и как он должен уметь делать. Программа максимум — это он должен уметь самостоятельно регулировать окно по своим данным без участия алгоритмов умного дома.  Чтобы пользователь мог приобрести привод, датчик и получить готовый законченный комплект для умного проветривания.  Есть на нем кнопки — значит нужна возможность ими закрывать/открывать окно. Есть экран и часы — значит нужно сделать расписание.  Можно в нем ограничить процент открытия окна, например не более 40%. Чтобы кот голову не смог просунуть (да, мы помним про кота и болеем за его психическое здоровье). Идеями фонтанировали все. Очень долго обсуждали название нового устройства. И остановились на Drivent Air.  А у меня периодически возникала мысль, что я очень хочу HomeKit в приводе.

1902cf3e8b218961f8a57fc0fa3b44b3.jpg

Надеешься на гитхаб? Ну-ну…

Казалось бы — чего проще? Возьми готовую библиотеку для HomeKit и интегрируй. Так  и сделал, начав писать оболочку для Drivent Air. Взял библиотеку, добавил в частично написанный скетч, посмотрел на оставшуюся свободную память (heap) и опечалился. Понял, что всё не влезет. Мне нужен был mqtt, веб-сервер для настройки девайса, HomeKit, UDP для управления приводом  и куча всяких мелочей.  А ОЗУ у меня было 81920 байт. Байт, Карл!   Масла в огонь подлил коллега, сказав, что у наших друзей из другого проекта не получилось в esp8266 всунуть mqtt и HomeKit вместе. И прошивка разделилась на 2 отдельные ветки. Правда потом они всунули в одну, но добавили переключатель в настройках — или mqtt или HomeKit. Но нам так не нравилось.

Вспомнились старые, давние времена. 386-е с 1 мегабайтом памяти, DOS и бухгалтерская программа БЭСТ. Каждое утро у меня начиналось со звонков бухгалтеров и воплей, что «у меня опять компьютер сломался, и цифры не набирает». Подходишь, нажимаешь кнопку Num Lock и они счастливы до следующего утра. В БИОСе настройки включения этой клавиши не было. Научить бабушек-бухгалтеров  самим нажимать эту кнопку не удавалось. Ну знаете, да — «я же не компьютерщик».  Я психанул и написал exe`шничек на 1,5 килобайта, который включает эту кнопку и запихнул его запуск в bat файл запуска бухгалтерской программы.  Теперь я мог спокойно приходить на работу с опозданием на час-два, и никто мне слова не говорил. Поняв, что программка может быть полезна не только мне, я выложил её в какую-то конференцию ФИДО. Ну не было тогда еще интернета. Вместо того, чтобы похвалить, на меня посыпалось — «ну кто так пишет — 1,5 кб на простейшую функцию», «руки оторвать программисту» и т.д. и т.п.  Через пару дней в конференции появился com-файл, байт на 150, который делал то же самое. «Вот, смотри как надо»! Я психанул. Несколько дней сидел за изучением ассемблера, команд процессора, прерываний и принципа работы буфера клавиатуры. И вот он мой триумф! Я выложил com-файл, который включал Num Lock и был размером в 16 байт.  Написать круче и короче не смог никто. Значит могу!

И я полез в дебри. Расковырял кучу разных библиотек HomeKit, выбрал оптимальную, и все равно переписал под свои задачи, выкинув кучу лишнего.  Убрал глюки, нашел и вылечил утечку памяти (вот с этим пришлось повеселиться). Прошерстил всю готовую прошивку привода, найдя в интернете и применив на практике кучу лайфхаков по экономии памяти.  Пару месяцев бега по граблям принесли свои результаты.  К марту 2021 года была готова прошивка привода с нативным Homekit, которая при всех запущенных службах и подключенных клиентах (mqtt, Homekit и UDP одновременно) имела 27600 байт свободной памяти.  Ну и к этому времени была написана основа для Drivent Air.

Тем временем где-то на другом конце страны.

Мой коллега по команде @Alex__AW  разрабатывал схемотехнику и разводил плату к Drivent Air.

38beb7a10adad8c26c068319e4498327.jpg

Приехали первые платы, собраны первые экземпляры, пойманы первые баги.  Я,  потихоньку писал и занимался отладкой софта, а @Alex__AW  занимался отладкой железа.

0018cec9ac38103680eed0733e9fbc81.jpg

И вот, в конце июня 2021 года первые 10 экземпляров Drivent Air были готовы и отправлены добровольным тестерам. 

a1b65c5bb7c0bb153245eefa2a6ad567.jpg

Схемотехника уже была вылизана, и нас интересовала обратная связь от пользователей — что удобно, что еще добавить, что изменить в софте. В процессе такого тестирования было выложено около 25 обновлений прошивки, и в январе 2022 года был объявлен официальный релиз Drivent Air.

За это время он научился: выдавать все данные с датчиков в mqtt и HomeKit, подключаться к Home Assistant через Discovery, управлять несколькими приводами по UDP. Он умеет PID регулировку окна по температуре или по СО2, встроенное расписание и кучу всяких мелких полезных функций. Продумали и реализовали правильную обратную связь. Например, если идет процесс управления окном по СО2, а мы решили закрыть окно кнопкой на приводе, то Drivent Air видит это вмешательство и прекращает регулировку, больше не дергая окно. Ввели контроль температуры при проветривании по СО2 — если СО2 всё еще завышен, а температура упала ниже заданного значения, то окно закрывается без всяких условий и регулировка будет продолжена только когда температура подрастёт. Приводами можно управлять с кнопок Drivent Air — открыть, закрыть, открыть на выбранный процент, можно с кнопок включить/выключить проветривание по СО2, включить режим термостата и установить желаемую температуру в комнате. Продуманы даже такие мелочи, как блокировка кнопок от детей,   установка любой яркости экрана, от 0 до 100%, с заданием времени перехода на дневной и ночной режимы. Даже отображение давления у нас делается с поправкой на высоту над уровнем моря, которая устанавливается пользователем в настройках.  Получилось вполне функциональное, законченное устройство, которое можно использовать и индивидуально. Но полностью его потенциал раскрывается именно при использовании его в связке с оконным приводом Drivent.

А команда Drivent, уже с моим участием, продолжает разработку других, не менее полезных и интересных устройств, о которых я расскажу в заключительной части.

Окончание следует…

© Habrahabr.ru