Борьба с курильщиками в отдельно взятой квартире

Вступление

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

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

Чтобы не держать окно в лоджии открытым круглый год, некоторое время назад в спальне был установлен проветриватель Tion 3S. В целом покупка оправдала ожидания, вентиляция работает эффективно даже на первой, самой тихой скорости, но иногда это становится проблемой: прибор одинаково эффективно затягивает в комнату как свежий воздух так и зловонный дым. Причем наличие hepa фильтра и угольного фильтра особой роли не играет, полностью с запахами он справиться не могут.

Идея

И тут я подумал, почему бы не использовать датчик частиц PM2.5, валяющийся на полке без дела, для определения уровня загрязнения входящего воздуха и отключать приток на время, достаточное для того, чтобы сосед снизу получил очередную дозу никотина и отвалился от окна. Как и ожидалось, электронный нос очень чутко реагирует на следы дыма в воздухе, поднимая значение PM2.5 с обычных 1-2 до 60 и более. А если рядом зажечь и погасить спичку, показатели подскакивают аж до 600 единиц. Кстати, его можно также использовать как “бесплатный” датчик задымления в помещении.

Подключаем бризер Tion к Home Assistant

С этим сложностей нет, уже долгое время доступно несколько вариантов интеграции:

Я остановился на управлении через облако, т.к. вместе с бризером по акции была приобретена станция Magic Air. Она представляет из себя небольшую коробочку с собственным блоком питания, которая выполняет несколько функций:

  • оценка уровня CO2 в помещении
  • отображение примерного уровня CO2 в комнате
  • управление бризером из облака и получение обратной связи о его состоянии по Bluetooth

Установка предельно проста: в случае, если вы пользуетесь прекрасным расширением HACS, достаточно добавить репозиторий airens/tion_home_assistant в список кастомных репозиториев и установить вновь появившийся аддон.

image-20210207135914026

После этого нужно добавить секцию tion в файл configuration.yaml и перезагрузить Home Assistant

tion:
  username: !secret tion_username
  password: !secret tion_password

Если кастомный компонент успешно подключился к облаку Magic Air, в списке сущностей можно будет найти бризер, введя в строке поиска “3s”.

image-20210207141930476

Подключаем датчик Xiaomi PM2.5 к Home Assistant

И вот, наконец, пришел звездный час железки под названием Xiaomi PM 2.5 Air Detector. Это небольшая коробочка с экраном, которая по WiFi передает в приложение MiHome показания уровня загрязненности воздуха. Подключение прибора сложностей не представляет, первым делом нужно добавить его в приложение MiHome. Рекомендую найти поблизости устройство на Андроеде и установить широко известное в узких кругах модифицированное приложения от vevs, которое помимо прочих плюшек позволяет легко получить токен устройства, необходимый для его конфигурации в Home Assistant. Есть и другие способы получения токена, но на мой взгляд этот является самым простым и надежным.

image-20210207205847580

Добавляем в configuration.yaml соответствующие настройки:

platform: xiaomi_miio
host: 192.168.1.73
token: !secret xiaomi_wifi_token

Перезагружаем Home Assistant и любуемся показаниями нового сенсора.

image-20210207143440165

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

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

Автоматизируем

Алгоритм получился очень простой: при превышении уровня частиц PM2.5 выше определенного порога скорость бризера устанавливается в 0 на заданное количество минут. По истечению этого интервала скорость устанавливается в 1. Я не стал заморачиватся с запоминанием и восстановлением текущей скорости бризера перед выключением учитывая, что большую часть времени он работает на первой скорости. Одновременно с изменением скорости работы бризера по всем требуемым каналам отправляются нотификации.

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

timer:
  tion:
    name: Временное выключение бризера 
    duration: '00:10:00'

Конфигурацию таймеров можно перезагрузить без рестарта всего Home Assistant, для этого в меню Server Controls предусмотрен отдельный пункт.

Наша первая автоматизация будет следить за превышением уровня PM2.5, отправлять команду на выключение бризера, а также запускать таймер возобновления работы. Проверять статус бризера перед выключением не обязательно, это лишь уменьшает количество нотификаций, если бризер уже выключен.

- id: '1612113635544'
  alias: 01 [TION] Switch off breeser when smoke is detected
  trigger:
  - platform: numeric_state
    entity_id: sensor.xiaomi_miio_pm25sensor
    above: '10'
  condition:
  - condition: and
    conditions:
    - condition: not
      conditions:
      - condition: state
        entity_id: climate.tion_breezer_3s_1
        state: 'off'
  action:
  - service: climate.set_fan_mode
    data:
      fan_mode: 0
    entity_id: climate.tion_breezer_3s_1
  - service: timer.start
    data: {}
    entity_id: timer.tion
  - service: notify.dima_telegram
    data:
      message: Smoke detected, shut down breeser for 10 munutes
  mode: single

Вторая автоматизация включает приточную вентиляцию через заданное время:

- id: '1612115080353'
  alias: 01 [TION] Switch on breeser after timeout
  trigger:
  - platform: event
    event_type: timer.finished
    event_data:
      entity_id: timer.tion
  condition: []
  action:
  - service: climate.set_fan_mode
    data:
      fan_mode: 1
    entity_id: climate.tion_breezer_3s_1
  - service: notify.dima_telegram
    data:
      message: Breeser switched on after 10 minute smoke shutdown
  mode: single

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

Заключение

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

Слабое место данной схемы - сам датчик, он имеет ограниченный ресурс и, если повезет, такая круглосуточно работающая система отработает год-два после чего датчик придется заменить. Впрочем, используемый в статье датчик легко заменяется на любой другой, я, например, купил на Aliexpress такой девайс за сравнительно смешные $16 и платку ESPХХ за $5. При минимальном вложении сил и времени из них с помощью ESPHome можно на коленке собрать законченное устройство. Причем такой датчик можно разместить непосредственно во входном канале вентиляции, из-за чего его чувствительность только повысится. Единственное, что может вызывать проблему, это минимальная рабочая температура.

Другой вариант улучшения - это прямое управление бризером по Bluetooth с помощью той же ESP32 или Raspberry Pi, таким образом теоретически можно улучшить надежность, исключив из цепочки облако Magic Air.

Моя конфигурация Home Assistant доступна здесь.

Бонус для тех, кто дочитал до конца

К сожалению, если возникают проблемы с соединением станции Magic Air с облаком, статус бризера и его атрибуты в Home Assistant не изменяются, поэтому понять о том, что бризер не подключён, можно только по косвенным признакам. Для этого я добавил статус присутствия бризера в сети. Если показатель CO2 не обновляется в течение 5 минут, считаем, что бризер недоступен. Если же показатели изменились (в т.ч. температура нагрева и скорость), значит бризер подключен. Сценарии использования данного сенсора оставлю на усмотрение читателя.

- id: '1612603099082'
  alias: 01 [TION] set offline status when not updated
  description: ''
  trigger:
  - platform: template
    value_template: '{{as_timestamp(now()) - as_timestamp(states.sensor.magicair_co2.last_updated)>300}}'
  condition: []
  action:
  - service: input_select.select_option
    data:
      option: offline
    entity_id: input_select.tion_3s_status_dropdown
  mode: single
- id: '1612603168948'
  alias: 01 [TION] Set online status when updated
  description: ''
  trigger:
  - platform: state
    entity_id: sensor.magicair_co2
  - platform: state
    entity_id: sensor.tion_breezer_3s_1_speed
  - platform: state
    entity_id: sensor.tion_breezer_3s_1_temp
  condition: []
  action:
  - service: input_select.select_option
    data:
      entity_id: input_select.tion_3s_status_dropdown
      option: online
  mode: single

Сенсоры sensor.magicair_co2, sensor.tion_breezer_3s_1_speed, sensor.tion_breezer_3s_1_temp созданы искусственно из атрибутов основной сущности tion_breezer_3s_1 примерно таким образом:

platform: template
sensors:
  tion_breezer_3s_1_temp:
    friendly_name: Температура нагрева
    entity_id: climate.tion_breezer_3s_1
    value_template: "{{ state_attr('climate.tion_breezer_3s_1', 'temperature') | int }}"
    icon_template: "mdi:radiator"

Последний удобен тем, что позволяет организовать некое подобие команды ping, т.е. отправить бризеру команду на изменение температуры нагрева, а затем прочитать дату последнего изменения сенсора (last_change). Таким образом можно убедиться, что бризер подключен и реагирует на команды.

tion