Aspirador Xiaomi como aspirar zonas específicas da casa


(Rodolfo) #1

Já foi aqui colocado no fórum, como poderiamos integrar o Aspirador da Xiaomi no Home Assistant como podes ver AQUI e também já te AQUI ensinamos como podes obter facilmente o Token do teu aspirador para o conseguires integrar.

Pois bem, agora quero partilhar contigo caso uses um dispositivo android como podes retirar as coordenadas das área de tua casa, isto é teres a possibilidade de aspirar somente uma área específica da tua casa, sem teres que recorrer a aplicação mi Home que já tem dísponivel essa opção.

Ok vamos começar

Primeiro precisas fazer uma aspiração total da tua casa com a app original mi home, para que consigas ter o mapeamento completo da tua casa. Após fazeres isso:

Vais precisar de instalar esta aplicação:

Ao abrires a app vai te aparece isto:

vais clicar em “Online import from xiaomi”

De seguida vai te aparecer :

Coloca os teus dados iguais aos da app original colocas mainland china e activas a primeira box e clicas em “Continue”

De seguida vai te aparecer isto:

Clica lá em cima do lado esquerdo onde te aparece as opções, de seguida vai te aparecer isto:

Clicas onde diz “MAP”

Vai te aparecer isto:

Clicas em Server e escolhes novamente a primeira opção e vai te aparecer isto:


Se não aparecer o mapa tens que aguardar uns segundos, mexe no ecran para ver se aparecer após aparecer clicas onde diz " Zoned Cleanup"

Vai te aparecer isto:

Agora vai clicar em “Add” vai te aparecer por cima do mapa um retangulo, vais seleccionar a área que queres aspirar e depois de seleccionada ficas a pressionar com o dedo sobre o botao que diz “Cleanup” e vai e aparecer um popup a dizer " copy clipboard" isso quer dizer que já tens as coordenadas dessa área.

Caso essa área tenha sido a cozinha abre um bloco de notas e escreve:

cozinha - e fazes botao lado direito do rato e o sistema vai te colar as coordenadas.
vai ficar tipo isto:

cozinha:[[20360,17872,23460,22122,1]]

Ok feito isto, repete o passo anterior, até teres as coordenadas de todas as áreas de tua casa.

cozinha:[[20360,17872,23460,22122,1]]
sala: bla bla bla~
quarto: bla bla bla
cozinha: bla bla bla

ok no teu groups.yaml coloca isto:

- group.aspiradorgroup

Dentro da tua pasta packages cria um ficheiro com o nome aspirador.yaml e coloca o seguinte código lá dentro:

homeassistant:

###############################################################################
#                                                                             #
#                           C U S T O M I Z E                                 #
#                                                                             #
###############################################################################

  customize:


    sensor.erro_aspirador:
      icon: mdi:close-box
    sensor.estado_aspirador:
      icone: hand-pointing-right


###############################################################################
#                                                                             #
#                         V A C U U M                                         #
#                                                                             #
###############################################################################  

vacuum:
  - platform: xiaomi_miio
    host: 192.168.1.117
    token: !secret token_xiaomi
    name: Aspirador
   
###############################################################################
#                                                                             #
#                         S E N S O R  S                                      #
#                                                                             #
###############################################################################        
      
sensor:
  platform: template
  sensors:
    estado_aspirador:
      friendly_name: 'Estado'
      value_template: >
        {%- if states.vacuum.aspirador.attributes.status == "Charging" %}
          A carregar
        {% elif states.vacuum.aspirador.attributes.status == "Cleaning" %}
          A limpar
        {% elif states.vacuum.aspirador.attributes.status == "Returning home" %}
          A voltar à base
        {% elif states.vacuum.aspirador.attributes.status == "Idle" %}
          Parado
        {% else %}
        {{ states.vacuum.aspirador.attributes.status }}
        {%- endif %}

    succao_aspirador:
      friendly_name: 'Velocidade de Sucção'
      value_template: "{{states.vacuum.aspirador.attributes.fan_speed}}"
      
    erro_aspirador:
      friendly_name: 'Existência de Erros'
      value_template: >
        {%- if 'Error' in states.vacuum.aspirador.attributes -%}
        {{ states.vacuum.aspirador.attributes.Error }}
        {%- else -%}
        Sem Erros
        {%- endif -%}
        
    bateria_aspirador:
      friendly_name: "Bateria"
      value_template: "{{ states.vacuum.aspirador.attributes.battery_level | int }}"
      unit_of_measurement: '%'
      icon_template: '{% if states.vacuum.aspirador.attributes.battery_level | int == 100 %}
                           mdi:battery
                        {% elif states.vacuum.aspirador.attributes.battery_level | int >= 90 %}
                           mdi:battery-90
                        {% elif states.vacuum.aspirador.attributes.battery_level | int >= 80 %}
                           mdi:battery-80
                        {% elif states.vacuum.aspirador.attributes.battery_level | int >= 70 %}
                           mdi:battery-70
                        {% elif states.vacuum.aspirador.attributes.battery_level | int >= 60 %}
                           mdi:battery-60
                        {% elif states.vacuum.aspirador.attributes.battery_level | int >= 50 %}
                           mdi:battery-50
                        {% elif states.vacuum.aspirador.attributes.battery_level | int >= 40 %}
                           mdi:battery-40
                        {% elif states.vacuum.aspirador.attributes.battery_level | int >= 30 %}
                           mdi:battery-30
                        {% elif states.vacuum.aspirador.attributes.battery_level | int >= 20 %}
                           mdi:battery-20
                        {% elif states.vacuum.aspirador.attributes.battery_level | int >= 10 %}
                           mdi:battery-10
                        {% elif states.vacuum.aspirador.attributes.battery_level == "unknown" %}
                           mdi:battery-alert
                        {% else %}
                           battery-outline
                        {% endif %}'
      
###############################################################################
#                                                                             #
#                         I N P U T    S E L E C T                            #
#                                                                             #
###############################################################################            
        
input_select:
  
  estados_de_succao:
    name: 'Estados de Sucção'
    initial: Silencioso
    options:
      - Silencioso
      - Balanceado
      - Turbo
      - Turbo Maximo

  zonas_de_aspiracao:
    name: Qual a zona a aspirar?
    options:
      - Escolhe a Zona
      - Casa Toda
      - Cozinha
      - Casa de Banho
      - Hall
      - Sala
      - Quarto Bia
      - Quarto

###############################################################################
#                                                                             #
#                         G R O U P                                           #
#                                                                             #
###############################################################################          
    
group:

  aspirador:
    view: yes
    name: Aspirador
    entities:
      - group.aspiradorgroup

  aspiradorgroup:
    control: hidden
    name: Aspirador
    entities:
      - input_select.zonas_de_aspiracao
      - sensor.estado_aspirador
      - input_select.estados_de_succao
      - sensor.bateria_aspirador
      - sensor.erro_aspirador

###############################################################################
#                                                                             #
#                         A U T O M A T I O N S                               #
#                                                                             #
###############################################################################     
automation:

#Coloca o aspirador em modo silencioso    
  - alias: Modo Silencioso
    trigger:
      platform: state
      entity_id: input_select.estados_de_succao
      to: "Silencioso"
    action:
      - service: vacuum.set_fan_speed
        data:
          entity_id: vacuum.aspirador
          fan_speed: Quiet

#Coloca o aspirador em modo balanceado           
  - alias: Modo Balanceado
    trigger:
      platform: state
      entity_id: input_select.estados_de_succao
      to: "Balanceado"
    action:
      - service: vacuum.set_fan_speed
        data:
          entity_id: vacuum.aspirador
          fan_speed: Balanced

#Coloca o aspirador em modo turbo        
  - alias: Modo Turbo
    trigger:
      platform: state
      entity_id: input_select.estados_de_succao
      to: "Turbo"
    action:
      - service: vacuum.set_fan_speed
        data:
          entity_id: vacuum.aspirador
          fan_speed: Turbo
 
#Coloca o aspirador em modo turbo maximo
  - alias: Modo Turbo
    trigger:
      platform: state
      entity_id: input_select.estados_de_succao
      to: "Turbo Maximo"
    action:
      - service: vacuum.set_fan_speed
        data:
          entity_id: vacuum.aspirador
          fan_speed: Max
  
#Notifica os utilizadores que a aspiracao comecou 
  - alias: 'Notificacao Inicio de aspiração'
    initial_state: true
    trigger:
      platform: state
      entity_id: sensor.estado_aspirador
      to: 'A limpar'
    action:
      service: notify.geraltelegram
      data_template:
        title: 'Início de aspiração'
        message: "Olá o Chinês iniciou agora a aspiração são neste momento {{states.sensor.time.state}} receberás uma mensagem assim que ele tiver acabado o seu serviço"
        
 #Notifica os utilizadores que a aspiracao acabou      
  - alias: 'Notificacao fim de aspiração'
    initial_state: true
    trigger:
      platform: state
      entity_id: sensor.estado_aspirador
      to: 'A voltar à base'
    action:
      service: notify.geraltelegram
      data_template:
        title: 'Fim de aspiração'
        message: "Olá o Chinês acabou de acabar o seu serviço de aspiração esteve {{states.vacuum.aspirador.attributes.cleaning_time }} minutos a aspirar, e aspirou {{states.vacuum.aspirador.attributes.cleaned_area }} m2. Está com {{states.vacuum.aspirador.attributes.battery_level }} de bateria. Ele está neste momento a regressar à base."
 
#Notifica os utilizadores que o aspirador chegou à base 
  - alias: 'Notificacao de chegada a base'
    initial_state: true
    trigger:
      platform: state
      entity_id: sensor.estado_aspirador
      from: 'A voltar à base'
      to: 'A carregar'
    action:
      service: notify.geraltelegram
      data_template:
        title: 'Chinês a carregar'
        message: "O Chinês encontrou a base e encontra-se a carregar"
        
#Notifica os utilizadores que ocorreu um erro    
  - alias: 'Notificacao de erro'
    initial_state: true
    trigger:
      platform: template
      value_template: >
          {%- if 'Error' in states.vacuum.aspirador.attributes -%}
          {{ states.vacuum.aspirador.attributes.Error }}   
          {% endif %}
    action:
      service: notify.geraltelegram
      data:
        title: 'Aconteceu alguma coisa'
        message: 'È melhor desligar o aspirador, concordas?'
        data:
          inline_keyboard:
            - "SIM:/simquero"
            - "NÃO:/naoquero"
 
#resposta a sim da automacao de cima
  - alias: 'Resposta a sim' 
    hide_entity: false
    trigger:
      platform: event
      event_type: telegram_callback
      event_data:
        data: '/simquero'            
    action:
      - service: vacuum.turn_off
        entity_id: vacuum.aspirador
        
      
#resposta a não da automacao de cima        
  - alias: 'Resposta a nao'
    hide_entity: true
    trigger:
      platform: event
      event_type: telegram_callback
      event_data:
        data: '/naoquero'
    action:
      - service: telegram_bot.answer_callback_query
        data_template:
          callback_query_id: '{{ trigger.event.data.id }}'
          message: 'Acho que fizeste mal'
        
#Notifica os utilizadores que o aspirador parou no regresso à base
  - alias: 'Notificacao de parado'
    initial_state: true
    trigger:
      platform: state
      entity_id: sensor.estado_aspirador
      from: 'A voltar à base'
      to: 'Parado'
    action:
      service: notify.geraltelegram
      data:
        title: 'Aconteceu alguma coisa'
        message: 'O aspirador está parado , aconteceu algo, é melhor desligar concordas?'
        data:
          inline_keyboard:
            - "SIM:/simquerodesligar"
            - "NÃO:/naoquerodesligar"

#resposta a sim da automação de cima         
  - alias: 'Resposta a quero desligar'
    hide_entity: false
    trigger:
      platform: event
      event_type: telegram_callback
      event_data:
        data: '/simquerodesligar'            
    action:
      - service: vacuum.turn_off
        entity_id: vacuum.aspirador
        
      
#resposta a não da automacao de cima          
  - alias: 'Resposta a nao quero desligar'
    hide_entity: true
    trigger:
      platform: event
      event_type: telegram_callback
      event_data:
        data: '/naoquerodesligar'
    action:
      - service: telegram_bot.answer_callback_query
        data_template:
          callback_query_id: '{{ trigger.event.data.id }}'
          message: 'Acho que fizeste mal'       


#Notifica os utilizadores que o aspirador parou 
  - alias: 'Notificacao parou'
    initial_state: true
    trigger:
      platform: state
      entity_id: sensor.estado_aspirador
      to: 'Parado'
    action:
      service: notify.geraltelegram
      data:
        title: 'Aconteceu alguma coisa'
        message: 'O aspirador está parado , aconteceu algo, é melhor desligar concordas?'
        data:
          inline_keyboard:
            - "SIM:/simquerodesligar"
            - "NÃO:/naoquerodesligar"

#resposta a sim da automação de cima         
  - alias: 'Resposta a quero desligar_'
    hide_entity: false
    trigger:
      platform: event
      event_type: telegram_callback
      event_data:
        data: '/simquerodesligar'            
    action:
      - service: vacuum.turn_off
        entity_id: vacuum.aspirador
        
      
#resposta a não da automacao de cima          
  - alias: 'Resposta a nao quero desligar_'
    hide_entity: true
    trigger:
      platform: event
      event_type: telegram_callback
      event_data:
        data: '/naoquerodesligar'
    action:
      - service: telegram_bot.answer_callback_query
        data_template:
          callback_query_id: '{{ trigger.event.data.id }}'
          message: 'Acho que fizeste mal'        
            
#Escolher a zona a aspirar

  - alias: Escolher a zona a aspirar
    hide_entity: True
    trigger:
      platform: state
      entity_id: input_select.zonas_de_aspiracao
      from: 'Escolhe a Zona'
    action:
      - service: script.turn_on
        data_template:
          entity_id: >
           {% if is_state("input_select.zonas_de_aspiracao", "Casa Toda") %}
            script.casa_toda
           {% elif is_state("input_select.zonas_de_aspiracao", "Cozinha") %}
            script.cozinha
           {% elif is_state("input_select.zonas_de_aspiracao", "Hall") %}
            script.hall
           {% elif is_state("input_select.zonas_de_aspiracao", "Sala") %}
            script.sala
            {% elif is_state("input_select.zonas_de_aspiracao", "Quarto") %}
            script.quarto
           {% elif is_state("input_select.zonas_de_aspiracao", "Quarto Bia") %}
            script.quarto_bia
           {% elif is_state("input_select.zonas_de_aspiracao", "Casa de Banho") %}
            script.casa_de_banho
           {% else %}
           {% endif %}
      - service: input_select.select_option
        entity_id: input_select.zonas_de_aspiracao
        data_template:
          option: "Escolhe a Zona"
###############################################################################
#                                                                             #
#                         S C R I P T S                                       #
#                                                                             #
############################################################################### 
 
 
 
script:

  cozinha:
    sequence:
       service: vacuum.send_command
       data:
         entity_id: vacuum.aspirador
         command: app_zoned_clean
         params: [[20348,26196,22998,31196,1]]
         
  hall:
    sequence:
       service: vacuum.send_command
       data:
         entity_id: vacuum.aspirador
         command: app_zoned_clean
         params: [[22018,22254,24768,25004,1]]
         
  sala:
    sequence:
       service: vacuum.send_command
       data:
         entity_id: vacuum.aspirador
         command: app_zoned_clean
         params: [[22018,22254,24768,25004,1]]
         
  quarto_bia:
    sequence:
       service: vacuum.send_command
       data:
         entity_id: vacuum.aspirador
         command: app_zoned_clean
         params: [[23566,17875,26616,22275,1]]     
         
  quarto:
    sequence:
       service: vacuum.send_command
       data:
         entity_id: vacuum.aspirador
         command: app_zoned_clean
         params: [[20360,17872,23460,22122,1]]
         
  casa_toda:
    sequence:
       service: homeassistant.turn_on
       data:
         entity_id: vacuum.aspirador

NOTA:
Onde te aparece cá em baixo no final do código:

script:

  cozinha:
    sequence:
       service: vacuum.send_command
       data:
         entity_id: vacuum.aspirador
         command: app_zoned_clean
         params: [[20348,26196,22998,31196,1]]
         
  hall:
    sequence:
       service: vacuum.send_command
       data:
         entity_id: vacuum.aspirador
         command: app_zoned_clean
         params: [[22018,22254,24768,25004,1]]
         etc etc etc

É aqui depois que tens que colocar as coordenadas da tua casa e o nome da área…


(Pedro Marques) #2

Olá Rodolfo,

Em primeiro lugar, parabéns pelo artigo.

Agora tenho uma dúvida, quando tento efetuar o login (online-import from Xiaomi), a app dá-me o seguinte erro:
“Error details
An unknown error occured”

Fazes alguma ideia do que possa ser?

Abraço


(Rodolfo) #3

No equipamento que estás a correr a aplicação está na mesma rede que o aspirador? E também tens a aplicação mi home instalada e com o login feito?


(Pedro Marques) #4

SIm, tentei com dados moveis, e wifi na mesma rede.
A mi home está instalada e com conta configurada.

Tenho é uma particularidade no wifi, que pode ser a causa.

O xiaomi gateway esta numa rede e o aspirador noutra, mas funciona (na mi home) sem problemas.


(Rodolfo) #5

Pode ser isso. Testa


(Luis Belo ) #6

@Rodolfo,
Estou com um problema…

Dá-me isto… Está tudo na mesma rede e ja confirmei o user/pass.

Podes confirmar ai no teu sff?

obr.


(Rodolfo) #7

Aqui está ok tens a certeza que tas a por username e password certa?


(Sérgio Lopes) #8

Olá @RodolfoVieira,

Antes de mais, obrigado pelo excelente trabalho. Acabei de integrar o meu Xiaomi Vaccum no HA e funciona na perfeição.
Achas que é possível no card “Aspirador” incluir os comandos conforme aparecem sugiro na imagem?


Abraço


(Rodolfo) #9

@Sergio_Lopes penso não ser possível fazer o que pretendes.


(Sérgio Lopes) #10

OK. Obrigado.
Bom fim de semana


(Marco Pinheiro) #11

Quando invoco o serviço, dá-me este erro:

“Invalid service data for vacuum.send_command: expected Dict for dictionary value @ data[‘params’]. Got [[23891, 16266, 31291, 21866, 1]]”

Aconteceu com mais alguém? Estou com um feeling de que será a minha versão do hass.io (ainda ando na .65).

Obrigado!


(Rodolfo) #12

@marcopinheiro poderá ser sim.
Alguma razão para que não possas actualizar, para testar.


(Marco Pinheiro) #13

Resolvido, era mesmo da versão do HA. Adio as atualizações sempre que posso :slight_smile:


(David Santos) #14

Desde já obrigado pelo artigo. Impecável.

Eu tenho o V1 que no como sabem ele faz um novo mapa sempre que começa a aspiração.

A minha dúvida é se eu mandar aspirar uma zona (exemplo corredor) ele vai fazer o mapa do corredor.
Mas se na seguinte aspiração mandar aspirar a sala ele vai? Visto que em teoria ele apenas ficou com o mapa da aspiração anterior que é o corredor.

Desde já obrigado.


(Sérgio Lopes) #15

@DavidSantos, por regra (e digo por regra porque os mapas desaparecem “milhentas” vezes) sempre que usares a aspiração de zona, o aspirador não cria mapas novos. Só cria mapas quando inicias uma aspiração normal. Portanto, sempre que mandarem para o corredor, ele aspira o corredor com base no mapa original e assim será nas seguintes aspirações até que, por alguma razão, o mapa mude.
Eu tenho as zonas a funcionar, mas confesso deixei de utilizar tais eram as vezes que o mapa alterava. Depois, como a aspiração é baseada em coordenadas, mandava para o corredor e ela andava pela casa de banho… resumindo, voltei a utilizar a app da xiaomi… lol

Bem, mas isto é a minha experiência.
Abraço


(David Santos) #16

@Sergio_Lopes obrigado pela partilha da tua experiência.
A mim já me aconteceu o mesmo. Não é que eu utilize muito as zonas, mas era mais uma opção.
E até mais rápida do que estar a desenhar na app.


(Jucas) #17

Boa tarde,

Parabéns pela detalhe da explicação…sou um iniciante nesta vida do hass.io e pelo que tenho andado a ver alguns tutoriais de como integrar com os dispositivos e toda a panópia de coisas …a minha pergunta é:

No script de cima, depois como integro com os comandos de voz do google home?

obrigado


(Rodolfo) #18

Boa tarde @jucas não tenho google home para te poder indicar a melhor forma.
Mas o @tmarquespt tem google home talvez ele saiba o comando certo.