Умный дом в котором я живу. Фильтрация  данных  с сенсоров

Привет, друзья. Давненько не  писал про умный дом. То  работа, то собственно  поиск решений и тестирование проблем по умному дому. 


В общем, сенсоры  и  обработка  сигналов  с  них.

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

Умный дом в котором я живу. Фильтрация  данных  с сенсоров Умный дом, Датчик, Длиннопост

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


Итак,  данные надо  отфильтровать.


Для этого  удобнее  разбить  фильтра на 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 мегов