Limpeza por área no robô aspirador Kabum Smart 700

Olá pessoal! Recentemente fiz a aquisição do robô Smart 700 da Kabum (v.2023), ao utilizá-lo, eu percebi que não há possibilidades de integrar a limpeza por área ou local no Home Assistant e na Alexa.

Foi então que decidi explorar uma maneira de realizar essa ação, e cheguei nesse formato que vou mostrar aqui nesse tutorial. Bem importante frisar utilizei unicamente para o meu caso, é uma tentativa de abrir para outras pessoas auxiliarem e evoluirmos essa solução.

Nota: Ainda não consegui implementar a limpeza por local marcado ou múltiplas áreas. Ajuda será muito bem vinda.

Pré Requisitos

  • PyScript instalado e configurado (via HACS).
  • Conhecimento mínimo de Python e conseguir rodar um arquivo .py no terminal.
  • Conhecimento de como usar a Conta Cloud da Tuya, com ela criada e conectada com os dispositivos.
  • Robô conectado no app da Kabum ou Smart Life (no tutorial vou utilizar o Smart Life).

1) Resgatando IP e Local Key do Robo

Pode pular essa etapa se você já sabe como fazer

Vamos utilizar a biblioteca tinytuya, siga as etapas de Instalação, depois escaneie a sua rede e rode o wizard para listar os dispositivos e seus respectivos local key.

2) Resgatando o código base64 do comando

Agora, vamos abrir o painel Cloud da TuYa, ir até os dispositivos, e monitorar os logs do robô. Com os logs do robô aberto, vamos no aplicativo, selecionar a área (somente uma) e mandar o robô limpar, aguarde um pouco e atualize os logs, você deverá olhar pelo Report de Instruction transmission, no meu caso ele vem antes do Partition error status prompt:

3) Extraindo o HEX e ajustando para o comando efetivo

Com esse base64 em mãos, nós vamos criar um arquivo python (dê o nome que quiser), para o tutorial vou utilizar test.py. Nele, vamos decodificar o código base64 para termos ele em HEX:

test.py
import base64

print('Ambiente')
esperado = base64.b64decode('qgAEFQEBCB8=') # substitua qgAEFQEBCB8= pelo seu código
print(esperado)

Agora rodando nosso test.py, teremos o código HEX esperado:

Para o robô receber o código correto, precisamos voltar 1 casa no quarto e sétimo comando, sendo assim, no meu exemplo o certo seria mandar:

\xaa\x00\x04\x14\x01\x01\x08\x1e

Se tiver dúvidas em qual é o anterior, você pode consultar a tabela ASCII completa

Agora, voltamos ao nosso test.py e codificamos de volta para base64 o comando HEX:

test.py
enviar = base64.b64encode(b'\xaa\x00\x04\x14\x01\x01\x08\x1e')
print(enviar)

Isso irá gerar o código base64 de comando para o aspirador.

4) Conclusão
Agora, com esse código, precisamos enviar ele para o DP de número 15 do Robô. Usando o pyscript, podemos criar um service que irá utilizar o tinytuya e mandar esse código para o robô. Crie o arquivo vacuum.py dentro de /config/pyscript:

vacuum.py
import tinytuya

# Connect to Device
d = tinytuya.OutletDevice(
    dev_id="xxxxxXxxxxXxxx",
    address="xxxXxxxxXxxx",
    local_key="'xxxxXxxxXxxx", 
    version=3.3)

# Codes
code_sacada = 'XxxxxXxxxxXxx'
code_sala = 'XxxxxXxxxxXxx'
code_entrada = 'XxxxxXxxxxXxx'
code_cozinha = 'XxxxxXxxxxXxx'

@service
def limpeza_area(area=None):
    if area == "sala":
        payload = d.generate_payload(tinytuya.CONTROL, {"15": code_sacada})
    elif area == "sala":
        payload = d.generate_payload(tinytuya.CONTROL, {"15": code_sala})
    elif area == "entrada":
        payload = d.generate_payload(tinytuya.CONTROL, {"15": code_entrada})
    elif area == "cozinha":
        payload = d.generate_payload(tinytuya.CONTROL, {"15": code_cozinha})
    d.send(payload)

Lembre de recarregar chamar o serviço para recarregar o pyscript.
Para testar, vá na ferramenta de desenvolvedor e chame o novo serviço:

service
service: pyscript.limpeza_area
data:
  area: cozinha

Locais específicos e Múltiplas Áreas

Ainda estou tentando identificar qual é o padrão de HEX enviado para essas ações específicas, estou aberto para quem quiser auxiliar a identificar como funciona.

2 curtidas

muito show, seria bacana postar imagem de como esta os cards, e para quem nao tem tanto conhecimento realmente ainda esta meio complicado rs

1 curtida