Часть 1 здесь

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Казалось бы – чего проще? Возьми готовую библиотеку для 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.

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

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

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

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

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

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

Комментарии (10)


  1. mopsicus
    05.10.2022 11:17

    Классно


  1. Kill_Voice
    05.10.2022 11:18
    +1

    А почему нельзя было взять Xiaomi ClearGrass Air Detector, а всё остальное решить автоматизацией?


    1. AGRO666 Автор
      05.10.2022 11:31
      +2

      Ну плюс у него, конечно, есть - красивый монитор. Но и минус - маленький злой вентилятор. Который смазать или заменить - это целая проблема. Ну и главное - это просто датчик. Рулить приводами окна он не умеет. А мы в Drivent Air засунули полноценную логику управления окном и по СО2 (под спойлером) и похожую по температуре.

      Hidden text

      1.1       Логика регулировки по СО2 (Проветривание):

       

      Описание дано для целевого значения 650.

      При изменении целевого значения, например на 700 (+50)- все параметры автоматизации так же смещаются на +50.

      СО2 от 800 до максимума:

      - СО2 растет - привод двигается +5

      - СО2 стоит - привод двигается +5

      - СО2 падает - привод стоит

       

      СО2 от 700 до 799:

      - СО2 растет - привод двигается +2

      - СО2 стоит - привод двигается +2

      - СО2 падает - привод стоит

       

      СО2 от 600 до 699:

      - СО2 растет - привод стоит

      - СО2 стоит - привод стоит

      - СО2 падает - привод стоит

       

      СО2 от 500 до 599:

      - СО2 растет - привод стоит

      - СО2 стоит - привод двигается -2

      - СО2 падает - привод двигается -2

       

      СО2 от минимума до 499:

      - СО2 растет - привод стоит

      - СО2 стоит - привод двигается -5

      - СО2 падает - привод двигается -5

       

      Дополнительно движение привода будет ограничено значениями Мин. target для AUTO и Макс. target для AUTO. Например, если стоит соответственно 10 и 90, то привод, в процессе регулировки, не закроет менее 10% и не откроет более 90%.

      Так же работа автоматизации ограничена параметрами Мин. темп. для AUTO и Макс. темп. для AUTO. Если температура выйдет за указанные пределы, окно будет полностью закрыто без всяких условий. Регулировка продолжится после возвращения температуры в разрешенные пределы с учетом заданного гистерезиса. Например стоит минимальная температура 24, максимальная 30 и гистерезис 1 градус. При падении температуры до 24, окно закрывается (0%, независимо от установки Мин. target для AUTO) и включается флаг гистерезиса (на экране, после значка градуса отображается тильда). Когда температура станет больше 25 градусов, окно снова начнет регулироваться и значок гистерезиса пропадет. То же самое, если произойдет нагрев до 30 градусов - окно закроется, и откроется когда упадет ниже 29. Исходя из этого, разница между максимальной и минимальной температурами должна быть БОЛЬШЕ установки гистерезиса. Меньше он не позволит поставить.


    1. foxyrus
      05.10.2022 11:31
      +1

      Air Monitor работает через закрытое облако, к которому нужно получать ключ.


      1. AGRO666 Автор
        05.10.2022 11:47
        +2

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


    1. AGRO666 Автор
      05.10.2022 11:36
      +2

      Вот так мы видим Drivent Air в HomeKit. Термостатом можно запустить проветривание для достижения необходимой температуры. Он не просто откроет окно, а полноценная PID регулировка, то есть он подберет процент открытия окна для достижения и поддержания заданной температуры. Ну а выключателем Проветривание запускается PID регулировка для достижения и поддержания уровня СО2, заданного в его настройках.

      Hidden text


  1. e-zig
    05.10.2022 20:21

    А датчик СО2 стоит прям в устройстве? У окна наверное СО2 подает сразу же как окно откроется?


    1. AGRO666 Автор
      05.10.2022 21:29

      Да, внутри. У меня стоит далеко от окна. Очень быстро реагирует термодатчик. Там Bosch BME-280. Чуть холодный воздух на него дунет, сразу защита от переохлаждения комнаты может сработать.


  1. MDiMaI666
    06.10.2022 03:57

    ... И вот он мой триумф! Я выложил com-файл, который включал Num Lock и был размером в 16 байт. Написать круче и короче не смог никто.

    обожаю такие моменты! =)


    1. AGRO666 Автор
      06.10.2022 12:03
      +1

      У меня потом несколько лет на стене висел распечатанный листочек с исходником этой софтинки, с развернутыми комментариями в каждой строчке и гордым заголовком "Как нужно писать программы" :) Жаль, был утрачен за давностью лет. Хотя, надо поискать на старых CDшках, может где сохранилась программа. Дизасемблировать 16 байт - проблем не представляет :)