Card Dashboard para robô aspirador Tuya - Kabum!

Neste tutorial compartilhamos um card para uso dos robôs aspiradores com vários comandos integrados:

Esse card foi idealizado pelo Junior Serafim do grupo do telegram.
image

Foi usado um aspirador integrado via Tuya V2 que está trazendo diversas informações via atributos, caso o seu seja diferente você deve adaptar os sensores para as informações do seu.

Para adicionar seu robô aspirador ao Home Assistant:

Se você usa a versão v1.5.0 ou inferior da integração Tuya V2 deve fazer as alterações desse post:

Dispositivo e atributos do robô aspirador utilizados:
image
image

Código para sensores template:

  - platform: template
    sensors:
    
      aspirador_nome:
        friendly_name: Robô Aspirador Nome
        value_template: Robô Aspirador
        
      aspirador_status:
        friendly_name: Robô Aspirador Status
        value_template: "{{state_attr('vacuum.robo_aspirador', 'status_full')}}"

      aspirador_status_texto:
        friendly_name: Robô Aspirador Status
        value_template: >-
          {% if (is_state('vacuum.robo_aspirador', 'unknown') or is_state('vacuum.robo_aspirador', 'unavailable')) %}
            Indisponível
          {% elif (state_attr('vacuum.robo_aspirador', 'fault')!=0 and state_attr('vacuum.robo_aspirador', 'fault')!=none) %}
            {% if (is_state_attr('vacuum.robo_aspirador', 'fault',1)) %}
              Falha: Roda Emperrada
            {% elif (is_state_attr('vacuum.robo_aspirador', 'fault',16)) %}
              Falha: Aspirador fora do chão
            {% elif (is_state_attr('vacuum.robo_aspirador', 'fault',32)) %}
              Falha: Parachoque emperrado (Esquerda)
            {% elif (is_state_attr('vacuum.robo_aspirador', 'fault',64)) %}
              Falha: Parachoque emperrado (Direita)
            {% elif (is_state_attr('vacuum.robo_aspirador', 'fault',512)) %}
              Falha: Recepiente de poeira não instalado
            {% elif (is_state_attr('vacuum.robo_aspirador', 'fault',2048)) %}
              Falha: Escova principal emperrada
            {% elif (is_state_attr('vacuum.robo_aspirador', 'fault',8192)) %}
              Falha: Reservatório de água removido
            {% elif (is_state_attr('vacuum.robo_aspirador', 'fault',32768)) %}
              Falha: Robô Preso
            {% else %}
              Falha {{state_attr('vacuum.robo_aspirador', 'fault')}}
            {% endif %}
          {% elif (is_state('vacuum.robo_aspirador','docked')) or (is_state_attr('vacuum.robo_aspirador', 'status_full','charging')) or (is_state_attr('vacuum.robo_aspirador', 'status_full','chargecompleted')) %}
            Na Base
          {% elif (is_state_attr('vacuum.robo_aspirador', 'status_full','docking')) %}
            Retornando para a base
          {% elif (is_state_attr('vacuum.robo_aspirador', 'status_full','workcompleted')) %}
            Limpeza Concluída
          {% elif (is_state_attr('vacuum.robo_aspirador', 'status_full','mopping')) %}
            Limpeza com pano
          {% elif (is_state_attr('vacuum.robo_aspirador', 'status_full','cleanning')) %}
            Aspiração
          {% elif (is_state_attr('vacuum.robo_aspirador', 'status_full','pause')) %}
            Pausado
          {% elif (is_state_attr('vacuum.robo_aspirador', 'status_full','sleep')) %}
            Standby (inativo)
          {% elif (is_state_attr('vacuum.robo_aspirador', 'status_full','standby')) %}
            Standby
          {% else %}
            -
          {% endif %}

      aspirador_bateria:
        friendly_name: Robô Aspirador Bateria
        value_template: "{{state_attr('vacuum.robo_aspirador', 'battery_level') | float}}"
        unit_of_measurement: "%"

      aspirador_bateria_status:
        friendly_name: Robô Bateria Status
        value_template: >-
          {% if (is_state_attr('vacuum.robo_aspirador', 'status_full','charging')) %}
            Carregando
          {% elif (is_state_attr('vacuum.robo_aspirador', 'status_full','chargecompleted')) %}
            Carregamento Completo
          {% elif (state_attr('vacuum.robo_aspirador', 'battery_level')<=20) %}
            Bateria Fraca
          {% else %}
            Bateria em descarga
          {% endif %}

      aspirador_modo:
        friendly_name: Robô Modo
        value_template: >-
          {% if (is_state_attr('vacuum.robo_aspirador', 'mode','smart')) %}
            Limpeza Automática
          {% elif (is_state_attr('vacuum.robo_aspirador', 'mode','spiral')) %}
            Espiral
          {% elif (is_state_attr('vacuum.robo_aspirador', 'mode','wall_follow')) %}
            Limpeza de Cantos
          {% elif (is_state_attr('vacuum.robo_aspirador', 'mode','single')) %}
            Limpeza de Cômodo
          {% elif (is_state_attr('vacuum.robo_aspirador', 'mode','chargego')) %}
            Base
          {% elif (is_state_attr('vacuum.robo_aspirador', 'mode','standby')) %}
            Em Espera
          {% else %}
            {{state_attr('vacuum.robo_aspirador', 'mode')}}
          {% endif %}

      aspirador_area:
        friendly_name: Robô Aspirador Área
        value_template: >-
          {% if (state_attr('vacuum.robo_aspirador', 'clean_area') != None) %}
            {{state_attr('vacuum.robo_aspirador', 'clean_area')}}
          {% else %}
            -
          {% endif %}
        unit_of_measurement: "m²"

      aspirador_tempo:
        friendly_name: Robô Aspirador Tempo
        value_template: >-
          {% if (state_attr('vacuum.robo_aspirador', 'clean_time') != None) %}
            {{state_attr('vacuum.robo_aspirador', 'clean_time')}}
          {% else %}
            -
          {% endif %}
        unit_of_measurement: "min"

Código para o card, utilizando o picture-elements:

type: picture-elements
image: /local/imagens/vacuum_kabum.jpg
elements:
  - entity: sensor.aspirador_tempo
    prefix: 'T. Limpeza: '
    style:
      top: 90%
      left: 25%
      '--iron-icon-fill-color': blue
    type: state-label
  - entity: sensor.aspirador_area
    prefix: 'Área Limpa: '
    style:
      top: 90%
      left: 72%
      '--iron-icon-fill-color': blue
    type: state-label
  - type: state-label
    entity: sensor.aspirador_modo
    prefix: 'Modo: '
    tap_action:
      action: call-service
      service: input_select.select_next
      service_data:
        entity_id:  input_select.aspirador_proximo_modo
    style:
      top: 28%
      left: 76%
  - entity: sensor.aspirador_nome
    style:
      top: 7%
      left: 50%
      '--iron-icon-fill-color': blue
    type: state-label
  - entity: sensor.aspirador_status_texto
    style:
      top: 15%
      left: 50%
      '--iron-icon-fill-color': blue
    type: state-label
  - type: icon
    icon: mdi:battery
    style:
      top: 63%
      left: 7%
      '--iron-icon-fill-color': blu
  - entity: sensor.aspirador_bateria
    style:
      top: 63%
      left: 15%
      '--iron-icon-fill-color': blue
    type: state-label
  - entity: sensor.aspirador_bateria_status
    style:
      top: 69%
      left: 23%
      '--iron-icon-fill-color': blue
    type: state-label
  - entity: input_boolean.aspirador_proximo_modo
    icon: mdi:robot-vacuum
    tap_action:
      action: toggle
    style:
      top: 78%
      left: 84%
    type: state-icon
  - type: icon
    icon: mdi:home-map-marker
    tap_action:
      action: call-service
      service: vacuum.return_to_base
      service_data:
        entity_id: vacuum.robo_aspirador
    style:
      top: 78%
      left: 70%
      '--iron-icon-fill-color': blue
  - type: icon
    icon: mdi:stop
    tap_action:
      action: call-service
      service: vacuum.stop
      service_data:
        entity_id: vacuum.robo_aspirador
    style:
      top: 78%
      left: 56%
      '--iron-icon-fill-color': blue
  - type: icon
    icon: mdi:pause
    tap_action:
      action: call-service
      service: vacuum.pause
      service_data:
        entity_id: vacuum.robo_aspirador
    style:
      top: 78%
      left: 42%
      '--iron-icon-fill-color': blue
  - type: icon
    icon: mdi:map-marker
    tap_action:
      action: call-service
      service: vacuum.locate
      service_data:
        entity_id: vacuum.robo_aspirador
    style:
      top: 78%
      left: 28%
      '--iron-icon-fill-color': blue
  - type: icon
    icon: mdi:play
    tap_action:
      action: call-service
      service: vacuum.start
      service_data:
        entity_id: vacuum.robo_aspirador
    style:
      top: 78%
      left: 14%
      '--iron-icon-fill-color': blue
  - entity: switch.aspirador_silenciado
    type: state-label
    prefix: 'Mudo: '
    tap_action:
      action: call-service
      service: switch.toggle
      service_data:
        entity_id: switch.aspirador_silenciado
    style:
      top: 69%
      left: 83%
      '--iron-icon-fill-color': blue
  - entity: switch.aspirador_silenciado
    state_color: true
    icon: mdi:volume-mute
    tap_action:
      action: call-service
      service: switch.toggle
      service_data:
        entity_id: switch.aspirador_silenciado
    style:
      top: 64%
      left: 83%
    type: state-icon

Imagem para utilizar no card:

Neste exemplo ela foi salva em /config/www/imagens/ com o nome vacuum_kabum.jpg.

Input boolean necessário para a função próximo modo do aspirador:

input_boolean:
  aspirador_proximo_modo:
    name: Aspirador - Selecionar Próximo Modo
    initial: off

Input select necessário para a função próximo modo do aspirador:

input_select:
  aspirador_proximo_modo:
    name: Aspirador - Seleção Próximo Modo
    options:
      - standby
      - smart
      - spiral
      - single
      - wall_follow
      - chargego
    initial: standby

Código no NodeRed para a função próximo modo do aspirador:

[{"id":"ace770c0211d2f52","type":"tab","label":"Flow 1","disabled":false,"info":""},{"id":"848e65ebd4a54e9b","type":"switch","z":"ace770c0211d2f52","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"standby","vt":"str"},{"t":"eq","v":"smart","vt":"str"},{"t":"eq","v":"spiral","vt":"str"},{"t":"eq","v":"single","vt":"str"},{"t":"eq","v":"wall_follow","vt":"str"},{"t":"eq","v":"chargego","vt":"str"}],"checkall":"true","repair":false,"outputs":6,"x":370,"y":280,"wires":[["4971499886d629ba"],["215f68b621416643"],["69839f9cb092a8de"],["00b4408d208e139b"],["0429bb9adee48a81"],["d83e3dfe845138a4"]]},{"id":"215f68b621416643","type":"api-call-service","z":"ace770c0211d2f52","name":"modo smart","server":"d6f9077a.fa6448","version":3,"debugenabled":false,"service_domain":"select","service":"select_option","entityId":"select.tyebced93a821db35059xhsx","data":"{\"option\":\"smart\"}","dataType":"jsonata","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":610,"y":200,"wires":[[]]},{"id":"00b4408d208e139b","type":"api-call-service","z":"ace770c0211d2f52","name":"modo single","server":"d6f9077a.fa6448","version":3,"debugenabled":false,"service_domain":"select","service":"select_option","entityId":"select.tyebced93a821db35059xhsx","data":"{\"option\":\"single\"}","dataType":"jsonata","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":610,"y":320,"wires":[[]]},{"id":"0429bb9adee48a81","type":"api-call-service","z":"ace770c0211d2f52","name":"modo wall_follow","server":"d6f9077a.fa6448","version":3,"debugenabled":false,"service_domain":"select","service":"select_option","entityId":"select.tyebced93a821db35059xhsx","data":"{\"option\":\"wall_follow\"}","dataType":"jsonata","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":630,"y":380,"wires":[[]]},{"id":"69839f9cb092a8de","type":"api-call-service","z":"ace770c0211d2f52","name":"modo Spiral","server":"d6f9077a.fa6448","version":3,"debugenabled":false,"service_domain":"select","service":"select_option","entityId":"select.tyebced93a821db35059xhsx","data":"{\"option\":\"spiral\"}","dataType":"jsonata","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":610,"y":260,"wires":[[]]},{"id":"2075dca4337e0e73","type":"server-state-changed","z":"ace770c0211d2f52","name":"modo aspiração","server":"d6f9077a.fa6448","version":3,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"input_select.aspirador_proximo_modo","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":120,"y":280,"wires":[["848e65ebd4a54e9b"]]},{"id":"4971499886d629ba","type":"api-call-service","z":"ace770c0211d2f52","name":"modo standby","server":"d6f9077a.fa6448","version":3,"debugenabled":false,"service_domain":"select","service":"select_option","entityId":"select.tyebced93a821db35059xhsx","data":"{\"option\":\"standby\"}","dataType":"jsonata","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":620,"y":140,"wires":[[]]},{"id":"d83e3dfe845138a4","type":"api-call-service","z":"ace770c0211d2f52","name":"modo chargego","server":"d6f9077a.fa6448","version":3,"debugenabled":false,"service_domain":"select","service":"select_option","entityId":"select.tyebced93a821db35059xhsx","data":"{\"option\":\"chargego\"}","dataType":"jsonata","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":620,"y":440,"wires":[[]]},{"id":"842b7e7ac0607c1c","type":"api-call-service","z":"ace770c0211d2f52","name":"Toggle Aspirador Modo","server":"d6f9077a.fa6448","version":3,"debugenabled":false,"service_domain":"input_select","service":"select_next","entityId":"input_select.aspirador_proximo_modo","data":"","dataType":"jsonata","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":640,"y":80,"wires":[[]]},{"id":"c5579b5c098f2819","type":"server-state-changed","z":"ace770c0211d2f52","name":"Input Proximo Modo","server":"d6f9077a.fa6448","version":3,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"input_boolean.aspirador_proximo_modo","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"on","halt_if_type":"str","halt_if_compare":"is","outputs":2,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":130,"y":80,"wires":[["c96f65ef8126be7c"],[]]},{"id":"c96f65ef8126be7c","type":"api-call-service","z":"ace770c0211d2f52","name":"Reset botão P/ off","server":"82136dea.a6d7a","version":3,"debugenabled":false,"service_domain":"input_boolean","service":"turn_off","entityId":"input_boolean.aspirador_proximo_modo","data":"","dataType":"json","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":350,"y":80,"wires":[["842b7e7ac0607c1c"]]},{"id":"9b8b06954bdbc23f","type":"comment","z":"ace770c0211d2f52","name":"Aspirador - Próximo Modo","info":"","x":130,"y":40,"wires":[]},{"id":"d6f9077a.fa6448","type":"server","name":"Home Assistant","version":1,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true},{"id":"82136dea.a6d7a","type":"server","name":"Home Assistant","version":1,"legacy":false,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true}]
6 Likes

Bom dia!
Show de bola!

Vou implementar aqui no meu.

Parabéns pelo post e valeu pelo compartilhamento.

1 Like

bom dia, bem legal mesmo

uni a dica anterior de implementação dos botões no vacuum-card com essa e agora tenho um botão a mais para alternar

** obrigado, estou aprendendo muito por aqui

1 Like

@douglasit , uma pequena correção:

Na parte de seleção dos modos, através do input_boolean, o nome da entidade ficou errado, daí quando carrega o card dá “entidade indisponível”.

O nome correto seria: input_boolean.aspirador_proximo_modo

image

No mais, testei e ficou muito bom!

Abraço.

Esse é o outro Douglas, @douglasit :blush:

Poxa, desculpe meu caro… hehe

Dei enter no @ sem me certificar

Corrigido no post! Obrigado.

1 Like

Boa tarde a todos!

Adicionei ao meu card a opção de silenciar o robô:

image

Código adicional do card:

  - type: icon
    icon: mdi:volume-mute
    tap_action:
      action: call-service
      service: switch.toggle
      service_data:
        entity_id: switch.som_robo
    style:
      top: 40%
      left: 84%
      '--iron-icon-fill-color': blue

Sempre que for clicado, será chamado o serviço switch.toogle para alternar o switch. Lembrando que a entidade switch.som_robo refere-se ao “voice_switch”, sendo assim, atentar-se a selecionar a entidade corretamente.

Abraço a todos!

1 Like

Muito bom! Atualizei o código do post, fiz uma pequena alteração para mostrar se está silenciado ou não.
image

Pra quem já está com o card pronto, basta adicionar esse código ao final dele:

  - entity: switch.aspirador_silenciado
    type: state-label
    prefix: 'Mudo: '
    tap_action:
      action: call-service
      service: switch.toggle
      service_data:
        entity_id: switch.aspirador_silenciado
    style:
      top: 69%
      left: 83%
      '--iron-icon-fill-color': blue
  - entity: switch.aspirador_silenciado
    state_color: true
    icon: mdi:volume-mute
    tap_action:
      action: call-service
      service: switch.toggle
      service_data:
        entity_id: switch.aspirador_silenciado
    style:
      top: 64%
      left: 83%
    type: state-icon
1 Like

Show de bola!
O lance do status ficou legal! Antes eu tinha de clicar duas vezes pra saber como estava hehehe

1 Like

de onde veio essa entidade switch.aspirador_silenciado? eu não tenho ela aqui

obrigado por compartilhar

O idioma no robo de vcs está em inglês ou português?

Se você usa a versão v1.5.0 ou inferior da integração Tuya V2 deve fazer as alterações desse post: