Wolfy

[X50 Ultra Complete] O meu X50 só carrega quando o sol paga a conta

Boa tarde a todos aqui no @Dreame Forum

Chamo-me Leandro, sou engenheiro eletrotécnico e tenho um X50 Ultra Complete há algum tempo. Vivemos em casa com a Nina, uma cadela de pelo comprido preto e branco, e quem tem cão sabe que isso é uma declaração de guerra permanente ao chão. A fotografia que junto é a nossa entrada, tal como está num sábado qualquer: os sapatos alinhados, a Nina sentada ao lado da base e o soalho a brilhar. Não arrumei nada para a fotografia. É esse o ponto.

Mas não é sobre aspirar que vos quero falar. É sobre uma coisa que fui descobrindo aos poucos e que acho que muita gente aqui ainda não sabe: o X50 não é só um aspirador. É um aparelho cheio de sensores que fala com o resto da casa.

O que descobri quando liguei o X50 ao Home Assistant

O Home Assistant é um sistema de domótica que corre em casa e junta num só sítio tudo o que temos ligado — luzes, alarme, painéis solares, carros, sensores de movimento. Quando lá liguei o X50, o que apareceu não foi um botão de ligar e desligar. Foi uma lista enorme: nível de bateria, estado de carga, mapa, progresso da limpeza, estado de cada consumível, horários, modos, zonas. Praticamente tudo o que a app mostra, e algumas coisas que a app não mostra.

E a partir do momento em que esses dados estão disponíveis, o aspirador deixa de ser um aparelho isolado e passa a ser uma peça que reage à casa. Deixo algumas ideias, para dar a noção do que é possível:
  • Aspirar só quando saímos de casa. O alarme ficar armado, ou o telemóvel sair da rede de casa, pode ser o sinal para o X50 arrancar. Ninguém em casa, ninguém incomodado, e chegamos a casa com tudo limpo.
  • Deixar a sala para o fim se estivermos a ver televisão. Se a TV está ligada, muda-se a ordem das divisões e a sala fica para último. Ou salta-se a sala nesse dia.
  • Limpar o corredor por número de passagens, não por horário. Um sensor de movimento no corredor conta as passagens; ao fim de trinta, o X50 vai lá dar uma volta só àquela zona. Faz muito mais sentido do que limpar à segunda-feira às nove porque sim.
  • Avisar quando é preciso mexer nos consumíveis. Uma mensagem no telemóvel quando faltam poucas horas para trocar o filtro ou a escova, em vez de ter de ir à app ver.

Nada disto exige que a Dreame faça seja o que for. Já está tudo disponível. Acrescento ainda que o X50 é compatível com Matter, e confesso que aí não tenho experiência nenhuma — não vou falar do que não sei — mas quem estiver por dentro do assunto tem aí mais uma porta aberta.

O que eu efetivamente fiz: o X50 carrega a sol

Vamos ao meu caso concreto.

Em casa temos seis painéis solares ligados a um inversor de 3,6 kW. Tenho tarifa bi-horária, o que quer dizer que a eletricidade da rede me custa quase três vezes mais durante o dia do que durante a noite. E quando os painéis produzem mais do que a casa consome, esse excedente vai para a rede e é-me pago a um valor muito baixo.

Ou seja: cada watt de sol que eu consigo gastar em casa vale-me várias vezes mais do que o mesmo watt vendido à rede.

Olhei para a base do X50 e pensei: aqui está um consumidor que não tem pressa nenhuma. O robô limpa uma vez por dia, a bateria dá para vários ciclos, e não faz a mínima diferença se ele carrega às dez da manhã ou às três da tarde. É o consumidor ideal para andar atrás do sol.

Além disso — e isto é um gosto meu, não uma recomendação a ninguém — habituei-me a não deixar os meus aparelhos de bateria a viver sempre no máximo. Faço-o com tudo cá em casa, e quis fazer o mesmo com o X50.

O problema, e o truque que o resolveu

Aqui está a parte que me deu trabalho e que é a razão de estar a escrever isto.

Não existe forma direta de dizer ao X50 "carrega agora" ou "não carregues agora". Nem na app, nem através do Home Assistant. O robô chega à base e carrega. É assim que ele é feito, e faz sentido que seja assim.

A solução veio de uma funcionalidade que a própria Dreame já lá pôs: o carregamento em vazio (off-peak). Serve para quem tem tarifas com horas mais baratas — define-se a janela horária e o robô só aceita carregar dentro dela.

E foi aí que percebi. Se eu puser essa janela numa hora que nunca coincide com o momento presente, o robô fica permanentemente "fora de horas" e não carrega. Se eu desligar a funcionalidade, ele volta a carregar normalmente. A funcionalidade de agendamento transforma-se, na prática, num interruptor de carga que a Dreame já me tinha dado sem eu perceber.

A partir daí é só lógica: há sol e a bateria está baixa? Desligo o off-peak e ele carrega de graça. Chegou ao nível que eu quero, ou o sol acabou? Ligo o off-peak e ele para.

As duas armadilhas que me custaram tempo

E aqui vai o que eu gostava de ter lido antes de começar, porque me pouparia uns dias.

Primeira: a janela não pode ser curta. A minha primeira versão punha uma janela de um minuto, o mais pequena possível para não apanhar nada. O robô ignorou-a por completo e continuou a carregar como se nada fosse. Passei um bom bocado convencido de que o problema estava no meu código. Não estava. Ao passar a janela para uma hora de duração, passou a funcionar à primeira. Não cheguei a testar os valores intermédios, portanto não sei dizer onde está exatamente o limite — só sei que um minuto não serve e uma hora serve.

Segunda: a janela tem de andar sempre a fugir do presente. Não basta defini-la uma vez. Como a hora vai passando, uma janela fixa acaba por ser apanhada pelo relógio. Por isso mantenho-a sempre doze horas à frente do momento atual, e um temporizador empurra-a de seis em seis horas. Se agora são dez da manhã, a janela está marcada para as dez da noite; daqui a seis horas volta a ser empurrada. Nunca coincide com o agora.

E deixo ainda um erro meu, porque também conta. Durante uns dias tive o sistema a não funcionar por eu estar a verificar se o robô estava na base antes de mexer no off-peak. Parecia lógico. Não era. Eu não estou a dar ordens ao aspirador — estou a configurar uma política da base. Se o robô anda a aspirar, a política aplica-se quando ele voltar. Onde ele está é completamente irrelevante. Assim que apaguei essa verificação, ficou tudo a funcionar.

O código, para quem o quiser

Se chegaram até aqui, provavelmente querem ver isto. A automação completa não cabia nesta publicação, por isso deixo-a no primeiro comentário, aqui mesmo por baixo. É só ajustar os nomes das entidades aos vossos e os valores ao vosso gosto.

Antes de a copiarem, três avisos honestos:
  • Isto assume que já têm Home Assistant a funcionar em casa. Não é um truque da app da Dreame.
  • A ligação ao X50 é feita através de uma integração da comunidade, não oficial. Funciona muito bem, mas é mantida por voluntários e às vezes uma atualização parte alguma coisa.
  • Os limiares de bateria e a lógica solar são os que servem a minha casa, com a minha tarifa e os meus painéis. Copiem a ideia, não os números.

Para terminar

Fica a ideia principal, que é a que me interessa passar: o X50 é uma excelente máquina a fazer aquilo para que foi comprado, mas é também uma peça que se integra no resto da casa. Isso, para quem gosta destas coisas, vale quase tanto como o aspirar.

Fico por aqui e disponível. Se alguém quiser tentar montar algo parecido e ficar preso a meio, é só perguntar por baixo que eu vou respondendo.

Esta publicação contém mais recursos.

Precisa de iniciar sessão para ver ou transferir. Não tem conta? Registo

×
Precisa de iniciar sessão para responder. Início de sessão | Registo

2 Comentário

Wolfy 1 Posição Iniciador do tópico
Como prometido, fica aqui a automação completa. Copiem para o vosso Home Assistant e ajustem os nomes das entidades.

yaml
alias: Solar - Dreame X50 Gestão de Carregamento
description: >
  Usa a agenda off-peak como interruptor de carga.
  Off-peak ON com hora futura = bloqueado. Off-peak OFF = carrega.
  A janela é mantida 12h à frente do momento atual, com 1h de duração
  (o robô ignora janelas mais curtas). Rotação de 6 em 6 horas.
triggers:
  - trigger: numeric_state
    entity_id: sensor.casa_corrente
    below: -1
    for:
      minutes: 5
    id: solar_on
  - trigger: numeric_state
    entity_id: sensor.casa_corrente
    above: 0
    for:
      minutes: 5
    id: solar_off
  - trigger: numeric_state
    entity_id: sensor.solax_srhmvtvjb8_ac_output_current
    below: 0.1
    for:
      minutes: 5
    id: sem_sol
  - trigger: numeric_state
    entity_id: sensor.x50_ultra_complete_battery_level
    below: 70
    id: bat_baixa
  - trigger: numeric_state
    entity_id: sensor.x50_ultra_complete_battery_level
    above: 80
    id: bat_cheia
  - trigger: numeric_state
    entity_id: sensor.x50_ultra_complete_battery_level
    below: 30
    id: bat_critica
  - trigger: time_pattern
    hours: /6
    id: rotacao_hora
  - trigger: state
    entity_id: sensor.x50_ultra_complete_charging_status
    id: estado_carga
conditions: []
actions:
  - variables:
      bat: '{{ states(''sensor.x50_ultra_complete_battery_level'') | int(50) }}'
      has_solar: '{{ states(''sensor.casa_corrente'') | float(0) < -1 }}'
      offpeak_on: '{{ is_state(''switch.x50_ultra_complete_off_peak_charging'', ''on'') }}'
      hora_futura_inicio: '{{ (now() + timedelta(hours=12)).strftime(''%H:%M:%S'') }}'
      hora_futura_fim: '{{ (now() + timedelta(hours=13)).strftime(''%H:%M:%S'') }}'
      deve_carregar: '{{ bat < 70 and has_solar }}'
  - choose:
      - conditions:
          - condition: trigger
            id: rotacao_hora
          - condition: template
            value_template: '{{ offpeak_on }}'
        sequence:
          - action: time.set_value
            target:
              entity_id: time.x50_ultra_complete_off_peak_charging_start
            data:
              time: '{{ hora_futura_inicio }}'
          - action: time.set_value
            target:
              entity_id: time.x50_ultra_complete_off_peak_charging_end
            data:
              time: '{{ hora_futura_fim }}'
      - conditions:
          - condition: template
            value_template: '{{ deve_carregar and offpeak_on }}'
          - condition: trigger
            id:
              - solar_on
              - bat_baixa
              - estado_carga
        sequence:
          - action: switch.turn_off
            target:
              entity_id: switch.x50_ultra_complete_off_peak_charging
      - conditions:
          - condition: trigger
            id: bat_cheia
          - condition: template
            value_template: '{{ not offpeak_on }}'
        sequence:
          - action: switch.turn_on
            target:
              entity_id: switch.x50_ultra_complete_off_peak_charging
          - action: time.set_value
            target:
              entity_id: time.x50_ultra_complete_off_peak_charging_start
            data:
              time: '{{ hora_futura_inicio }}'
          - action: time.set_value
            target:
              entity_id: time.x50_ultra_complete_off_peak_charging_end
            data:
              time: '{{ hora_futura_fim }}'
      - conditions:
          - condition: or
            conditions:
              - condition: trigger
                id: solar_off
              - condition: trigger
                id: sem_sol
          - condition: template
            value_template: '{{ not offpeak_on and bat < 80 }}'
        sequence:
          - action: switch.turn_on
            target:
              entity_id: switch.x50_ultra_complete_off_peak_charging
          - action: time.set_value
            target:
              entity_id: time.x50_ultra_complete_off_peak_charging_start
            data:
              time: '{{ hora_futura_inicio }}'
          - action: time.set_value
            target:
              entity_id: time.x50_ultra_complete_off_peak_charging_end
            data:
              time: '{{ hora_futura_fim }}'
      - conditions:
          - condition: trigger
            id: bat_critica
          - condition: template
            value_template: '{{ offpeak_on }}'
        sequence:
          - action: switch.turn_off
            target:
              entity_id: switch.x50_ultra_complete_off_peak_charging
mode: single
max_exceeded: silent

Tirei as notificações que envio para o telemóvel, para não encher isto. Quem quiser, é só acrescentar uma ação notify em cada ramo.
Dreame Forum 2 Posição
🎉Olá, bem-vindo(a) ao Fórum Dreame!
Muito obrigado pela sua excelente partilha!
Parabéns, desbloqueou com sucesso o Presente de Boas-Vindas Dreame. O seu código de resgate será enviado para o seu e-mail. Por favor, verifique a sua caixa de entrada (e a pasta de spam, se necessário).

Obrigado por fazer parte da nossa comunidade Dreame! 💙
UID:DL591559 PT
  • 3Publicações
  • 0Amigos

© 2026 Dreame Forum All Rights Reserved | Support by Discuz! X5.0 Font by MiSans

Resposta rápida Voltar ao topo Voltar à lista