Добавляем пылесосу одометр
Всем привет. У меня накопилось несколько интересных решений для умного дома, которыми я хочу поделиться. Понятия не имею куда писать подобные статьи. Для хабра слишком просто, для телеграм чата по HomeAssistant - прочитают два с половиной человека, пост утонет в потоке. Поэтому сюда!
И так одометр пылесоса. Зачем он нужен?
Первоначально один мой знакомый попросил помочь ему с автоматизацией - уведомление когда заканчивается вода в пылесосе. Но как сделать подобное если пылесос никак не отслеживает уровень воды? Но каждый же может примерно оценить на сколько ему хватает бака?
У меня и моего товарища пылесос Xiaomi, а точнее его очередной дочки - Xiaomi Mijia Robot Vacuum Mop P STYJ02YM. На самом деле для дальнейшего повествования это не суть важно. Я хочу описать принцип работы, а полученные знания можно применить к кучу других пылесосов.
И так у меня есть устройство пылесос. У устройства есть атрибуты:
Нас будет интересовать два из них - box_type и cleaned_area. Из cleaned_area мы создадим одометр, а с помощью изменения box_type будем его сбрасывать.
И так начнем с одометра. Создадим виртуальный сенсор пробега:
template:
sensor:
- name: home_vacuum_box_type
icon: mdi:boombox
state: >
{{ state_attr('vacuum.home_vacuum', 'box_type') }}
- name: home_vacuum_cleaned_area_now
icon: mdi:counter
state: >
{{ state_attr('vacuum.home_vacuum', 'cleaned_area') }}
unit_of_measurement: 'm²'
Где home_vacuum_box_type - название виртуального сенсора, а {{ state_attr('vacuum.home_vacuum', 'box_type') }} - его показание, которое будем брать из атрибута box_type у устройства vacuum.home_vacuum.
Таким образом мы создаем два сенсора:
sensor.home_vacuum_box_type - показывающий текущий тип контейнера
sensor.home_vacuum_cleaned_area_now - показывающий текущий пробег
Теперь создадим сам одометр:
utility_meter:
home_vacuum:
source: sensor.home_vacuum_cleaned_area_now
name: home_vacuum_cleaned_area
Так как показания sensor.home_vacuum_cleaned_area_now будут отображаться как - сколько убрано площади в данный момент - то есть 2 метра, через минуту 5 метров и.т.д. Нам надо использовать utility_meter. Он не будет складывать 2+5, а считать правильно. Так же будет учитывать что показания могут откатываться на 0 при постановке на док станцию и тогда к текущем 5 метрам полученными с прошлой уборки, будут прибавляться новые показания с текущей уборки. Короче говоря мы получим sensor.home_vacuum_cleaned_area который уже будет работать как настоящий одометр.
Далее нам надо как то сбрасывать одометр при вытряхивании/замене контейнера. Именно для этого мы будем использовать sensor.home_vacuum_box_type. В моем пылесосе sensor.home_vacuum_box_type '1' - контейнер для пыли, sensor.home_vacuum_box_type '3' - контейнер для воды и sensor.home_vacuum_box_type '0' - контейнер отсутвует.
Именно 0 то нас и интересует. Создадим простейшую автоматизацию:
- alias: Дом - Пылесос - Сброс счетчика уборки при замене контейнера
id: home_vacuum_automation_clean_count_reset
mode: single
trigger:
- platform: state
entity_id:
- sensor.home_vacuum_box_type
to: "0"
action:
- service: utility_meter.calibrate
data:
value: "0"
target:
entity_id: sensor.home_vacuum_cleaned_area
Где триггером будет выступать состояние 0 у sensor.home_vacuum_box_type. Это значит что контейнер я вынул - значит одометр нужно сбросить.
Таким нехитрым образом мы добавили к пылесосу одометр который сбрасывается при замене/очистке контейнера. Остается лишь дописать автоматизации вроде - если тип контейнера 3, а одометр больше 60 метров, тогда отправить сообщение на Алису/телеграм/куда вам удобно - вода заканчивается.