Умный дом в котором я живу. Фильтрация данных с сенсоров
Привет, друзья. Давненько не писал про умный дом. То работа, то собственно поиск решений и тестирование проблем по умному дому.
В общем, сенсоры и обработка сигналов с них.
Воткнув пачку сенсоров и настроив управление зачастую сталкиваемся с тем, что сигнал сенсора довольно зашумлен и работать с ним тяжело. Разве что управление по гистерезису будет ок. Да и база данных распухает с неимоверной быстротой.
Ни про вменяемое управление пропорционально сигналу можно забыть. По такому сигналу очиститель щелкал скоростями в пропорциональном режиме как дурной и это довольно сильно раздражало, я уже молчу о том, чтоб прикручивать какое-то более умное регулирование ПИ, ПД или ПИД
Итак, данные надо отфильтровать.
Для этого удобнее разбить фильтра на raw (c сырыми данными) и filtred (c данными отфильтрованными).
Для этого в configuration. yaml приводим строку sensors к виду
sensor: !include_dir_merge_list sensorСоздаем каталог sensor где будут описаны все наши сенсоры.
Вообще, если подразумевается какая-то сложная структура - очень удобная штука.
Она читает все файлы по дереву в каталоге sensor и лепит из них один большой конфиг.
Гораздо удобнее чем лазить по конфигу в тысячу -другую строк.
В файле raw.yaml создаем "сырой" сенсор, который читает значение атрибута
pm25_sensor_raw:Далее методом проб и ошибок был подобран фильтр который дает отличную кривую, с которой уже можно работать:
friendly_name: PM25 raw
value_template: "{{ states('sensor.co2_cleargrass') }}"
unit_of_measurement: 'AQI'
- platform: filterКак видим он состоит из НЧ фильтра и фильтра выбросов.
name: "PM2.5_raw"
entity_id: sensor.pm25_sensor_raw
filters:
- filter: outlier
window_size: 10
radius: 3.0
- filter: lowpass
time_constant: 10
precision: 1
Но здесь меня ждала засада. Если вдруг датчик отвалился, фильтра переставал работать и отваливалась автоматизация, т.к. фильтрованный сигнал перестает быть числом.
Лечение данной проблемы заняло у меня довольно много времени, но был найден оптимальный вариант: присваивать значение, если значение фильтра неизвестно.
Встал вопрос какое. Можно присвоить очень большое или маленькое значение - это решение отлично, если фильтр быстро поднимется.
Мой вариант - присваивать значение чуть выше нижнего порога регулирования. Это позволит не молотить исполнительным устройством на полную, и дождаться реакции оператора на сообщение в телегу "датчик сдох".
Вот окончательный код сырого датчика
pm25_sensor_raw:В итоге мы получаем вот такое качество сигнала
friendly_name: PM25 raw
value_template: >
{% if states.sensor.co2_cleargrass.state is defined %}
{{ states('sensor.pm25') }}
{% else %}
5
{% endif %}
unit_of_measurement: 'AQI'
И за час
С таким сигналом управления уже можно работать. и даже простейшее П-регулирование обеспечивает комфортное управление.
И размер бд (хранятся эвенты за неделю) упал с 1,8 гб до 400 мегов