Чем займемся?

Рассмотрим интеграцию умного пылесоса на примере Xiaomi Mijia Sweeping Vacuum Cleaner 1C. Этим пылесосом можно управлять как локально, так и через экосистему MiHome. Аналогично можно поступить и с вашими моделями.

Мы займемся решением следующих задач:

  • Обновим звуковой пакет пылесоса.
  • Проведем интеграцию пылесоса в Home Assistant, управление локальное.
  • Настроим карточку управления.
  • Сделаем интерактивную карту вызова зон уборки.
  • Организуем уведомления о начале/завершении уборки.
Меняем звуковой пакет

Скачиваем и устанавливаем кастомное приложение от Vevs – kapiba.ru (Только Android).Скачиваем подходящий звуковой пакет на 4PDA для вашего пылесоса.Скачиваем и меняем файл main.bundle (предварительно скаченный звуковой пакет переименовываем в

main.bundle) в своем телефоне по пути (цифры в конце буду различаться):

/storage/emulated/0/Android/data/com.xiaomi.smarthome/files/plugin/install/rn/1000004/1003860/android

 

В меню MiHome от Vevs зайти в настройку языка, выбрать загруженный звуковой пакет.

Интеграция пылесоса через кастомный компонент в Home Assistant

Добавим и настроим карточку управленияДобавим и настроим карточку управленияСкачиваем и устанавливаем кастомное приложение от Vevs kapiba.ru (Только Android).Заходим в приложение и вытаскиваем токен: долгим нажатием на пылесосе, изменить имя…Добавляем интеграцию через HACS в Home Assistant, для моего пылесоса это xiaomi_vacuum. У меня не самая распространенная модель, пробуйте сначала штатную интеграцию в HA.Указываем параметры подключения:

vacuum: – platform: xiaomi_vacuum host: <ip> token: “<token>” name: <name>

Добавим и настроим основную карточку управления

Используется кастомная интеграция, добавленная через HACS:

github.com/denysdovhan/vacuum-card

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

				
					compact_view: false
entity: vacuum.xiaomi_vacuum_cleaner
image: /local/vacuum.png
show_name: true
show_status: true
show_toolbar: true
stats:
  cleaning:
    - attribute: cleaned_area
      subtitle: Cleaning area
      unit: m2
    - attribute: cleaning_time
      subtitle: Cleaning time
      unit: minutes
  default:
    - attribute: filter_life_level
      subtitle: Фильтр
      unit: '-%'
    - attribute: side_brush_life_level
      subtitle: Бок. щетка
      unit: '-%'
    - attribute: main_brush_life_level
      subtitle: Гл. щетка
      unit: '-%'
  actions:
    - name: Очистка квартиры без подготовки
      service: script.vacuum_all
      icon: mdi:floor-plan
    - name: Очистка комнаты
      service: script.vacuum_room
      icon: mdi:bed-empty
    - name: Очистка кухни
      service: script.vacuum_kitchen
      icon: mdi:silverware-fork-knife
    - name: Очистка холла
      service: script.vacuum_hall
      icon: mdi:door
type: custom:vacuum-card
				
			
Сделаем интерактивную карту зональной уборки

ВАЖНО! У меня не самая распространенная версия пылесоса, я не могу вытащить карту из облака Mi, поэтому делал свою, она не отображает в реальном времени движение пылесоса.

Для начала пробуйте пользоваться этим:

github.com/PiotrMachowski/lovelace-xiaomi-vacuum-map-card

github.com/PiotrMachowski/Home-Assistant-custom-components-Xiaomi-Cloud-Map-Extractor

Если не подходит, мой пример для вас.

Для начала выловим координаты наших зон уборки:

Снова используем кастомное приложение MiHome от Vevs.Заходим в приложение и отправляем пылесос на нужную нам площадь.Через проводник в телефоне, лезем в логи приложения

“/vevs/logs/miio”и получаем координаты:

{“id”:9556,“method”:“action”,“params”:{“did”:“292175500”,“siid”:18,“aiid”:1,“in”:[{“piid”:1,“value”:19},{“piid”:21,“value”:“2213,4329,9706,5834”}]}}

С полученными координатами заводим скрипты. Они как раз и будут отправлять пылесос на нужную площадь. Скрипты прикручиваем к карточке управления и карте.

Пример скрипта с использованием координат:

				
					script:
  vacuum_room:
    alias: "Пылесос. Комната"
    sequence:
#Запускаем пылесос по координатам
      - service: xiaomi_vacuum.vacuum_clean_zone
        data_template:
          entity_id: vacuum.xiaomi_vacuum_cleaner
          repeats: 1
          zone: "-2146,-2414,722,3497"
#Настраиваем громкость на колонке и озвучиваем запуск
      - service: media_player.volume_set
        data:
          entity_id: media_player.yandex_station
          volume_level: 0.4
      - delay: "00:00:05"
      - service: media_player.play_media
        entity_id: media_player.yandex_station
        data:
          media_content_id: "Уборка будет произведена только в комнате."
          media_content_type: text
#Отправляем уведомления в Телеграм
      - service: notify.telegram_nikita
        data_template:
          title: "*Тимон:*"
          message: "Уборка будет произведена только в комнате."
      - service: notify.telegram_liza
        data_template:
          title: "*Тимон:*"
          message: "Уборка будет произведена только в комнате."
				
			

Создадим саму карту.

3D модель советую делать в ScetchUP, рендер картинки через Vray плагин.

Итого что получилось у меня, пример на одной комнате:

Основная картинка
Накладывается сверху при активации

Пример настройки карточки, управляется через кастомный элемент – github.com/iantrich/config-template-card

				
					type: custom:config-template-card
entities:
  - vacuum.xiaomi_vacuum_cleaner
card:
  type: picture-elements
  image: /local/floorplan/0_day_clean_1.jpg
  style: |
    ha-card:first-child {
      background: rgba(42, 46, 48, 1);
    }
  elements:
    - type: image
      entity: vacuum.xiaomi_vacuum_cleaner
      image: /local/floorplan/clean_room.png
      left: 50%
      top: 50%
      width: 100%
      mix-blend-mode: lighten
      action: none
      tap_action:
        action: none
      hold_action:
        action: none
      style:
        filter: >
          ${ "hue-rotate(" + (states['script.vacuum_room'].attributes.hs_color ? states['script.vacuum_room'].attributes.hs_color[0] : 0) + "deg)" }
    
    - type: state-icon
      entity: vacuum.xiaomi_vacuum_cleaner
      icon: mdi:broom
      tap_action:
        action: call-service
        service: script.vacuum_room
      hold_action:
        action: none
      style:
        left: 69%
        top: 65%
        width: 2vw
        height: 2vw
        transform: scale(1)
        margin-left: "-1.5vw"
        margin-top: "-1.5vw"
        display: flex
        align-items: center
        justify-content: center
        background-color: "#FFFFFF"
        border-radius: "100%"
        box-shadow: "0px 0px 28px 0px rgba(0,0,0,0.39)"
        --iron-icon-height: 2vw
        --iron-icon-width: 2vw
        --paper-item-icon-color: darkgrey
        --paper-item-icon-active-color: "#000000"
				
			
Добавим уведомления

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

				
					sensor:
#Создаем сенсоры фильтра и щеток для отправки уведомления при завершении уборки
  - platform: template
    sensors:
      vacuum_filter:
        friendly_name: "Пылесос. Статус фильтра"
        value_template: "{{ state_attr('vacuum.xiaomi_vacuum_cleaner', 'filter_life_level') }}"
        unit_of_measurement: "%"
      vacuum_main_brush:
        friendly_name: "Пысос. Главная щетка"
        value_template: "{{ state_attr('vacuum.xiaomi_vacuum_cleaner', 'main_brush_life_level') }}"
        unit_of_measurement: "%"
      vacuum_side_brush:
        friendly_name: "Пылесос. Боковая щетка"
        value_template: "{{ state_attr('vacuum.xiaomi_vacuum_cleaner', 'side_brush_life_level') }}"
        unit_of_measurement: "%"

automation:
#Общее уведомление о начале уборки
  - id: vacuum_start_telegram
    alias: "Пылесос. Начало уборки, уведом.телеграм"
    trigger:
      - platform: state
        entity_id: vacuum.xiaomi_vacuum_cleaner
        to: "cleaning"
    condition:
      - condition: time
        after: "09:00:00"
        before: "00:00:00"
    action:
      - delay: "00:00:10"
      - service: notify.telegram_nikita
        data_template:
          title: "*Тимон:*"
          message: "Начинаю уборку."
      - service: notify.telegram_liza
        data_template:
          title: "*Тимон:*"
          message: "Начинаю уборку."

#Общее уведомление о конце уборки
  - id: vacuum_end
    alias: "Пылесос. Окончание"
    trigger:
      - platform: state
        entity_id: vacuum.xiaomi_vacuum_cleaner
        from: "cleaning"
    condition:
      - condition: time
        after: "09:00:00"
        before: "00:00:00"
    action:
      - service: media_player.volume_set
        data:
          entity_id: media_player.yandex_station
          volume_level: 0.3
      - delay: "00:00:01"
      - service: media_player.play_media
        entity_id: media_player.yandex_station
        data:
          media_content_id: "Уборка завершена"
          media_content_type: text
      - service: notify.telegram_nikita
        data_template:
          title: "*Тимон: уборка завершена.*"
          message: >
            Состояние фильтра: {{ state_attr('vacuum.xiaomi_vacuum_cleaner', 'filter_life_level') }} %.
            Состояние главной щетки: {{ state_attr('vacuum.xiaomi_vacuum_cleaner', 'main_brush_life_level') }} %.
            Состояние боковой щетки: {{ state_attr('vacuum.xiaomi_vacuum_cleaner', 'side_brush_life_level') }} %.
      - service: notify.telegram_liza
        data_template:
          title: "*Тимон: уборка завершена.*"
          message: >
            Состояние фильтра: {{ state_attr('vacuum.xiaomi_vacuum_cleaner', 'filter_life_level') }} %.
            Состояние главной щетки: {{ state_attr('vacuum.xiaomi_vacuum_cleaner', 'main_brush_life_level') }} %.
            Состояние боковой щетки: {{ state_attr('vacuum.xiaomi_vacuum_cleaner', 'side_brush_life_level') }} %.

#Уведомление о простое больше 2х дней с передачей клавиш на выбор типа уборки/помещений
  - id: vacuum_not_cleaning
    alias: "Пылесос. Простой. Реакция."
    trigger:
      - platform: time
        at: "15:00:00"
    condition:
      - condition: state
        entity_id: vacuum.xiaomi_vacuum_cleaner
        state: "off"
      - condition: template
        value_template: "{{ as_timestamp(now()) - as_timestamp(state_attr('vacuum.xiaomi_vacuum_cleaner', 'last_cleaned')) > 144000 }}"
    action:
      - service: notify.telegram_nikita
        data:
          title: "*Тимон: вы не убирались больше 2х дней.*"
          message: "Что хотите очистить?"
          data:
            inline_keyboard:
              - "Вся квартира:/command1, Комната:/command2"
              - "Кухня:/command3, Прихожая:/command4"
      - service: notify.telegram_liza
        data:
          title: "*Тимон: вы не убирались больше 2х дней.*"
          message: "Что хотите очистить?"
          data:
            inline_keyboard:
              - "Вся квартира:/command1, Комната:/command2"
              - "Кухня:/command3, Прихожая:/command4"
      - delay: "00:00:10"
      - service: input_boolean.turn_off
        data:
          entity_id: input_boolean.vacuum_cleaning

  - id: vacuum_telegram_command1
    alias: "Пылесос. Выбор всей квартиры"
    trigger:
      - platform: event
        event_type: telegram_callback
        event_data:
          command: "/command1"
    action:
      - service: script.vacuum_all

  - id: vacuum_telegram_command2
    alias: "Пылесос. Выбор комнаты"
    trigger:
      - platform: event
        event_type: telegram_callback
        event_data:
          command: "/command2"
    action:
      - service: script.vacuum_room

  - id: vacuum_telegram_command3
    alias: "Пылесос. Выбор кухни"
    trigger:
      - platform: event
        event_type: telegram_callback
        event_data:
          command: "/command3"
    action:
      - service: script.vacuum_kitchen

  - id: vacuum_telegram_command4
    alias: "Пылесос. Выбор коридора"
    trigger:
      - platform: event
        event_type: telegram_callback
        event_data:
          command: "/command4"
    action:
      - service: script.vacuum_hall