Converter um medidor/disjuntor Tuya de calha DIN SMTONOFF ZMAi-90 em Tasmota e integração no HA

Este dispositivo, que desempenha a dupla função de controlar (ligar e desligar) o circuito ao qual está ligado, bem como de medir 8 grandezas relacionadas com a energia electrica, está à venda na Internet em diversos sitios, nomeadamente a Aliexpress, ou na Amazon, por valores que rondam os 28 Euros. Existe um segundo dispositivo, com a marca e modelo SINOTIMER WDS688, que se trata aparentemente de um clone. Já houve confirmação de utilizadores, de este ter sido convertido com sucesso para Tasmota pelo mesmo processo. Alguns links para os dois artigos, no retalho online:

SMTONOFF ZMAi-90 - https://pt.aliexpress.com/item/32962808336.html
SINOTIMER WDS688 - WDS688 90 250VAC WIFI Smart Switch Energy Meter Remote Control by APP Energy Saving Wattmeter Multi functional Countdown Timer - AliExpress

As 8 grandezas que o dispositivo mede são nomeadamente:

  • energia total consumida em kWh;
  • tensão da rede electrica, em Volts;
  • corrente instantânea consumida pelo circuito electrico, em Amperes;
  • potência aparente em Watts;
  • potência activa em Watts;
  • potência reactiva em Watts;
  • factor de potência em %;
  • frequência em Hz;

Em termos de corrente, segundo é anunciado pelo fabricante, o relé suporta o máximo de 60 Amperes.

Apesar de ter vindo a identificar que este dispositivo teria potencial para poder ser convertido em Tasmota e assim deixar de (pelos menos) depender da cloud Tuya, deparei-me com o facto que na comunidade ainda não se tinha ido para além da conversão (através do projecto tuya-convert) para Tasmota, habilitando aquilo que este firmware permitia na altura, nomeadamente o controlo do relé e não mais do que isso.

Assim, pus mãos à obra e decidi investigar melhor o dispositivo, e fazer o necessario a fim de chegar a um procedimento que esteja tão ao alcançe de todos quanto possivel.

  1. Preparação do dispositivo

A primeira coisa que é necessario fazer, como não podia deixar de ser, é a conversão do dispositivo em si. Existem duas abordagens possíveis: 1) uma que tem por vantagem não implicar abrir fisicamente o dispositivo e dominar a arte do ferro de soldar, mas que por outro lado pode não funcionar com todos os firmwares colocados pelo fabricante, e também tem um pouco de complexidade no setup de software necessario; e 2) outra, que apesar de exigir o acesso fisico ao dispositivo de modo a poder ligar a porta série para programação, tem a garantia de funcionar independentemente do firmware que esteja originalmente no dispositivo, e é relativamente simples do ponto de vista do setup de software necessario.

Assim temos respectivamente:

1.1 - Converter usando o utilitario tuya-convert:

  • configurar um computador com uma instalação de linux (pode ser uma imagem em VMWare, ou até mesmo um Raspberry Pi (ver detalhes em https://github.com/ct-Open-Source/tuya-convert). Este computador terá de dispor de uma interface WiFi;
  • obter o binario do firmware Tasmota, versão 7.2 ou superior (já inclui o comando SerialConfig, necessario para esta integração) - pode ser obtido a partir daqui - https://github.com/arendst/Tasmota/releases;
  • seguir os passos de setup do tuya-convert (clone do repo git, execução do script install_prereq.sh);
  • colocar o binario do firmware Tasmota obtido anteriormente, por debaixo da pasta files/ do projecto tuya-convert;
  • colocar o dispositivo em modo de emparelhamento (deixar o botão “Pair” pressionado durante alguns segundos até o LED azul piscar);
  • na maquina linux, correr o script ./start_flash.sh e seguir as instruções apresentadas. O bootloader do tuya-convert será instalado no dispositivo e posto em execução. Serão apresentados os comandos curl para ser possivel fazer o backup do firmware original, e o update para o firmware Tasmota (ou outro) que esteja na pasta files/;
  • assim que o Tasmota estiver flashado no dispositivo, como em qualquer dispositivo “tasmotizado”, há de estar visivel um novo AP WiFi, com um nome semelhante a “tasmota-xxxx”. Ligar a este AP e preencher os detalhes da sua rede WiFi no formulário (captive portal) que é apresentado. Após carregar em “Save”, o dispositivo irá reinciar e ficar associado à rede que foi especificada.

1.2 - converter usando adaptador série:

  • para começar é necessario dispor de um adaptador que forneça os niveis da porta série a 3.3 Volts (5 Volts ou mais irão danificar permanentemente o hardware). Pode ser usado por exemplo o adaptador USB “FTDI FT232RL”. Assegurar que o jumper deste está na posição 3.3V:

  • será necessario soldar temporariamente um fio entre o pino RSTn do microcontrolador V9821 (responsavel pelas medições de energia) e GND. O objectivo é colocar este microcontrolar desactivado enquanto se procede à programação do microcontrolador principal. O respectivo contacto pode ser localizado com base na imagem:

  • soldar também um fio entre o pino GPIO0 do microncontrador principal (o ESP8266 localizado na breakout board TYWE3S). Isto irá colocar este microntrolador em modo de programação.
  • por fim soldar também fios para os pinos TX, RX e GND deste mesmo microcontrolador. Estes fios irão ligar ao adaptador de porta série indicado acima;
  • Fornecer 5 Volts e GND aos pinos indicados na imagem mostrada acima;
  • de seguida, usando o script python “esptool” (que pode ser obtido deste projecto - https://github.com/espressif/esptool), proceder ao flash do firmware. Como indicado acima, para o procedimento com o tuya-convert, o binário trata-se do mesmo ficheiro e pode ser obtido da mesma localização. É necessario no comando de programação, forçar o tamanho da flash a 1MB devido ao facto que para este dispositivo a tool não consegue reconhecer correctamente o tamanho da flash:

$ esptool.py --port COM3 --baud 74880 --after no_reset write_flash --flash_size 1MB --flash_mode dio 0x00000 tasmota.bin --erase-all

(substituir COM3 pelo valor apropriado no vosso caso - ver por exemplo no “Gestor de Dispositivos” do Windows)

  • após o dispositivo ter sido programado com sucesso, desligá-lo e remover os shunts e ligações efectuadas excepto a alimentação. Ligar novamente a alimentação de +5 Volts e GND de modo a testar o dispositivo. Há de estar visivel um novo AP WiFi, com um nome semelhante a “tasmota-xxxx”. Ligar a este AP e preencher os detalhes da sua rede WiFi no formulário (captive portal) que é apresentado. Após carregar em “Save”, o dispositivo irá reinciar e ficar associado à rede que foi especificada.
  • desligar a alimentação, montar a placa novamente no dispositivo, e ligar este com uma ficha de electricidade de modo a poder ser testado directamente com uma carga.

2 - Configurar o Tasmota

2.1 - para começar será necessario configurar o Tasmota relativamente aos seus aspectos básicos: MQTT enable e configuração dos detalhes do broker:

  • entrando na web UI do dispositivo, ir a Configuration > Configure Other > carregar em “MQTT enable” e atribuir o “friendly name”. Clicar em Save no final:

  • ir também a Configuration > Configure MQTT e definir os detalhes do broker MQTT ao qual o dispositivo se irá ligar. Clicar em Save no final:

  • de modo a preparar os pinos GPIO e definir o tipo de módulo, ir a Configuration > Configure Module. Começar por definir o módulo como “Generic (0)”. Clicar em “Save”. Voltar ao mesmo menu depois de o dispositivo reiniciar, e definir as portas GPIO conforme a imagem:

2.2. Configurar a porta série do dispositivo (esta é usada para a comunicação com o microncontrolador escravo - o V9821 usado para as medições)

  • no menu principal ir a “Console”;
  • introduzir o comando abaixo, de modo a definir a velocidade:

Baudrate 9600

  • configurar os parâmetros da porta correctos, usando o comando:

`SerialConfig 8E1``

2.3. Definir uma regra para que o dispositivo envie o comando de medição para o microcontrolador escravo periodicamente

  • novamente na consola, escrever:

Rule1 on System#Boot do RuleTimer1 10 endon on Rules#Timer=1 do backlog SerialSend5 fe010f080000001c; RuleTimer1 10 endon

  • habilitar a regra, escrevendo:

Rule1 1

  • com esta regra o Tasmota passará a enviar a cada 10 segundo o pedido de medição. A resposta será publicada no tópico MQTT de telemetria (e.g. tele/general-meter-switch/RESULT):

02:59:15 MQT: tele/general-meter-switch/RESULT = {"SerialReceived":"FE01083002000076230000808404000050000028431100000000007253110000100000A6"}

  • de modo a evitar comportamentos adversos, tais como o chamado “ghost switching”, executar também os seguintes comandos:
PowerOnState 3
SwitchRetain OFF
ButtonRetain OFF
PowerRetain ON

3 - Configurar o Hass.io

Aqui será necessario definir dois tipos de entidades: 1) sensor - um por cada medição (são 8 no total); 2) switch - para controlar o estado do relé;

3.1. Editar o ficheiro que está em /config/configuration.yaml.

  • Adicionar as seguintes entradas na secção “sensor”:
- platform: mqtt
    name: "Mains Consumed Energy"
    state_topic: "tele/general-meter-switch/RESULT"
    value_template: >- 
      {% set message = value_json.SerialReceived %}
      {% set payload = message[6:14] %}
      {% set payload_len = (payload | length) %}
      {% set result = namespace(value='') %}
      {% for i in range(0, payload_len + 1) | reverse -%}
        {%- if i is divisibleby 2 -%}
          {%- set result.value = result.value + payload[i:i+2] -%}
        {%- endif -%}
      {%- endfor -%}
      {{ (result.value|float) / 100 }}
    unit_of_measurement: 'kWh'    
  - platform: mqtt
    name: "Mains Voltage"
    state_topic: "tele/general-meter-switch/RESULT"
    value_template: >- 
      {% set message = value_json.SerialReceived %}
      {% set payload = message[14:22] %}
      {% set payload_len = (payload | length) %}
      {% set result = namespace(value='') %}
      {% for i in range(0, payload_len + 1) | reverse -%}
        {%- if i is divisibleby 2 -%}
          {%- set result.value = result.value + payload[i:i+2] -%}
        {%- endif -%}
      {%- endfor -%}
      {{ (result.value|float) / 10 }}
    unit_of_measurement: 'Volts'
  - platform: mqtt
    name: "Mains Current"
    state_topic: "tele/general-meter-switch/RESULT"
    value_template: >- 
      {% set message = value_json.SerialReceived %}
      {% set payload = message[22:30] %}
      {% set payload_len = (payload | length) %}
      {% set result = namespace(value='') %}
      {% for i in range(0, payload_len + 1) | reverse -%}
        {%- if i is divisibleby 2 -%}
          {%- set result.value = result.value + payload[i:i+2] -%}
        {%- endif -%}
      {%- endfor -%}
      {{ (result.value|float) / 10000 }}
    unit_of_measurement: 'Amps'
  - platform: mqtt
    name: "Mains Frequency"
    state_topic: "tele/general-meter-switch/RESULT"
    value_template: >- 
      {% set message = value_json.SerialReceived %}
      {% set payload = message[30:38] %}
      {% set payload_len = (payload | length) %}
      {% set result = namespace(value='') %}
      {% for i in range(0, payload_len + 1) | reverse -%}
        {%- if i is divisibleby 2 -%}
          {%- set result.value = result.value + payload[i:i+2] -%}
        {%- endif -%}
      {%- endfor -%}
      {{ (result.value|float) / 100 }}
    unit_of_measurement: 'Hz'
  - platform: mqtt
    name: "Mains Active Power"
    state_topic: "tele/general-meter-switch/RESULT"
    value_template: >- 
      {% set message = value_json.SerialReceived %}
      {% set payload = message[38:46] %}
      {% set payload_len = (payload | length) %}
      {% set result = namespace(value='') %}
      {% for i in range(0, payload_len + 1) | reverse -%}
        {%- if i is divisibleby 2 -%}
          {%- set result.value = result.value + payload[i:i+2] -%}
        {%- endif -%}
      {%- endfor -%}
      {{ (result.value|float) / 100 }}
    unit_of_measurement: 'Watts'    
  - platform: mqtt
    name: "Mains Reactive Power"
    state_topic: "tele/general-meter-switch/RESULT"
    value_template: >- 
      {% set message = value_json.SerialReceived %}
      {% set payload = message[46:54] %}
      {% set payload_len = (payload | length) %}
      {% set result = namespace(value='') %}
      {% for i in range(0, payload_len + 1) | reverse -%}
        {%- if i is divisibleby 2 -%}
          {%- set result.value = result.value + payload[i:i+2] -%}
        {%- endif -%}
      {%- endfor -%}
      {{ (result.value|float) / 100 }}
    unit_of_measurement: 'Watts'      
  - platform: mqtt
    name: "Mains Apparent Power"
    state_topic: "tele/general-meter-switch/RESULT"
    value_template: >- 
      {% set message = value_json.SerialReceived %}
      {% set payload = message[54:62] %}
      {% set payload_len = (payload | length) %}
      {% set result = namespace(value='') %}
      {% for i in range(0, payload_len + 1) | reverse -%}
        {%- if i is divisibleby 2 -%}
          {%- set result.value = result.value + payload[i:i+2] -%}
        {%- endif -%}
      {%- endfor -%}
      {{ (result.value|float) / 100 }}
    unit_of_measurement: 'Watts'
  - platform: mqtt
    name: "Mains Power Factor"
    state_topic: "tele/general-meter-switch/RESULT"
    value_template: >- 
      {% set message = value_json.SerialReceived %}
      {% set payload = message[62:70] %}
      {% set payload_len = (payload | length) %}
      {% set result = namespace(value='') %}
      {% for i in range(0, payload_len + 1) | reverse -%}
        {%- if i is divisibleby 2 -%}
          {%- set result.value = result.value + payload[i:i+2] -%}
        {%- endif -%}
      {%- endfor -%}
      {{ (result.value|float) / 10 }}
    unit_of_measurement: '%'
  • editar a secção “switch”, acrescentando:
- platform: mqtt
    name: general-meter-switch
    state_topic: 'stat/general-meter-switch/RESULT'
    value_template: '{{ value_json["POWER"] }}'
    command_topic: 'cmnd/general-meter-switch/POWER'
    availability_topic: 'tele/general-meter-switch/LWT'
    qos: 1
    payload_on: 'ON'
    payload_off: 'OFF'
    payload_available: 'Online'
    payload_not_available: 'Offline'
    retain: false
  • reiniciar o Hass.io. Caso a UI lovelace esteja em modo automático, os badges dos novos sensores deverão passar a estar visíveis:

  • bem como o cartão para controlar o relé:

Espero que este procedimento seja útil na integração com este tipo de dispositivo.

As instruções que compus originalmente (em inglês) bem como o relato do processo ao longo do “reverse engineering” do dispositivo, podem ser encontrados no meu blog

Cumprimentos

9 Curtiram

Muito obrigado pela partilha de conhecimento.
Sem dúvida um excelente post e alternativa ao tutorial do:

Pzem e
Sdm 120

Bom tutorial, obrigado!

Já testaste se o comando que configura o baudrate a 9600 não reverte para o default ao faltar a energia ou a fazer reset? Eu tenho um SDM120 com um D1 Mini que tem de ter o baudrate cofigurado por rule senão perde a configuração.

Com efeito, agora fiz um teste com o firmware 8.1.0 em um sonoff Dual R2, e ele apesar de aparentemente gravar na flash as alterações, não está a assumir, após um reboot:

15:28:24 CMD: Baudrate 9600
15:28:24 SRC: WebConsole from 192.168.1.150
15:28:24 CMD: Group 0, Index 1, Command "BAUDRATE", Data "9600"
15:28:24 APP: Set Serial to 8N1 9600 bit/s
15:28:24 MQT: stat/dual-switch/RESULT = {"Baudrate":9600}
15:28:24 CFG: Saved to flash at F8, Count 172, Bytes 4096

(reboot)

15:30:29 CMD: Baudrate
15:30:29 SRC: WebConsole from 192.168.1.150
15:30:29 CMD: Group 0, Index 1, Command "BAUDRATE", Data ""
15:30:29 MQT: stat/dual-switch/RESULT = {"Baudrate":115200}

Não vou poder para já testar no ZMAi-90 pois está em uso.

@j_assuncao começaste a observar este comportamento a partir de alguma versão especifica do Tasmota?

Só precisei de alterar o baudrate depois de ter instalado o medidor de energia (SDM120 - D1 Mini) e isso foi na 6.6.4

Podes usar a rule Rule1 ON System#Boot DO baudrate 9600 ENDON e depois Rule1 on (atenção que se já tiveres outra Rule1 deves mudar o numero desta ou concatenar as duas).

Penso que o @Maddoctor me me tinha dito à uns tempos que nas versões >7.x do Tasmota a velocidade por defeito tinha baixado para os 9600 mas pelo teu log parece que essa mudança foi revertida.

Vou abrir um issue no Tasmota. Supostamente deveria estar a persistir, pois há um campo dedicado para o efeito, que é guardado na flash. Eventualmente há codigo no arranque que passa por cima dessa definição…

1 Curtiu

Criei o issue:

Cumprimentos

Está resolvido e colocado na branch desenvolvimento, conforme indicado pelo Jason2866:

Fixed in latest development version.
You can download at http://thehackbox.org/tasmota/tasmota.bin

2 Curtiram

Foi rápida a alteração!

1 Curtiu

Se não me engano, foi coincidência… Esse problema já tinha sido resolvido recentemente… :wink:
Daí a “solução” tão rápida à issue… Aliás, se forem ver aos últimos comentários de changes em cada ficheiro, nem consta essa alteração… Se tivesse ocorrido agora, apareceria como última alteração.
Eles são rápidos, mas não tanto! :wink:

2 Curtiram

Esse disjuntor serve para energia 220v bifasico?? Aqui em Minas Gerais / BR o 220v são 2 fases de 110v.

@Mauricio_Lima à partida diria que deve funcionar… Faz ideia qual o ângulo entre as fases? A frequência da rede é 60 Hz? O medidor está especificado para 90-250 V e 50-60 Hz.

Convém no entanto ter em conta que o relé deste aparelho apenas interrompe uma das fases.

Acabei de ter a confirmação que o disjuntor de calha DIN SINOTIMER WDS688 também pode ser covertido pelo mesmo processo que o ZMAi-90. Ainda que aparentemente não seja mais do que um clone do último, é sempre bom ter à disposição mais opções de compra:

1 Curtiu

Amigos, comprei um medidor desse recentemente no Aliexpress, sua versão atual de Firmware é 1.0.2, acontece que o dispositivo nao esta registrando o consumo de energia e nem gravando consumo total. No display do dispositivo o registro é fornecido corretamente, ja pelo aplicativo Tuya / Smart Life nao faz monitoramento de energia nenhum. A função liga/desliga funciona, so monitoramento e gravações de consumo de energia que nao registra. Teria como atualizar Firmware original para 1.0.6 ?

Bem vindo ao fórum da CPHA @Ikeda e não esqueças de ler os nossos Termos do Serviço/Regras e a FAQ.

Não percebi bem a tua intenção,queres seguir este tutorial e integrar o teu dispostivo com o HA?

Ola amigo, não , gostaria de usá-lo original em aplicativo Tuya.

@Ikeda este fórum é sobre a plataforma Home Assistant, não damos suporte a outras aplicações ou assuntos relacionados com clouds e aplicações salvo raras exepcões como por exemplo obter tokens e afins.
Dito isto terás que tentar encontrar um outro fórum que te preste a devida ajuda no sentido de veres esclarecida a tua pergunta.
Obrigado

1 Curtiu

Bom da,

Sou muito iniciante neste mundo no entanto estou a explorar. Este poste está fantástico no entanto estou com alguma duvidas relativamente a solda dos pinos… Será que me poderia ajudar a enviar fotos de como soldou mesmo…

Muito obrigado pela ajuda…

Cumprimentos

Olá @Tiago_Jorge,

Dá uma espreitadela no post:

https://forum.cpha.pt/t/medidor-wds688/3870

Olá a todos,
em especial ao @teixeluis que já “falámos” no fórum oficial do Home Assistant sobre este trabalho/análise incrível que ele fez.

Finalmente o meu ZMAi-90 chegou e tive algum tempo para o tentar flashar, mas estou a ter problemas. Agradecia se me pudessem ajudar ou dar pelo menos algumas dicas. É a primeira vez que tento usar o tuya-convert.

Sigo todos os passos do tuya-convert (ligar telemóvel ao AP, por o device em emparelhamento), durante o processo o device liga-se ao AP e a luz deixa de piscar, mas nada. O tuya-convert chega ao fim das tentativas e não consegue flashar o device.
Não há erros, simplesmente fica a tentar e não começa o processo de flash.

Uma vez que não estava a conseguir flashar liguei o device à app Tuya, e o device parece funcionar bem, dá para ligar/desligar o relé e vejo a voltagem da rede. O firmware que lá aparece é 1.0.2. Achei um pouco estranho… pelo número fico com a ideia que será “antigo”.
Aparentemente a app não lhe faz update nenhum.

Reparei ainda que o comportamento durante o processo de flash, no tuya-convert, é diferente, dependendo se deixei o relé ativo ou não (na app).

  • Tendo o relé desligado (era como vinha de origem): quando o processo de flash começa, o device está sempre a ligar e a desligar-se do AP, e a led passa a piscar no seguinte padrão: pisca 4x (mais rápido que quando está em modo de emparelhamento) e apaga, e repete sempre este padrão. O tuya-convert esgota as tentativas e não faz o flash.
  • Com o relé ligado (depois de o ter ligado pela app): acontece o que descrevi mais em cima (e me parece o comportamento normal), liga-se ao AP, a led apaga, mas o tuya-convert esgota as tentativas e nada…

Alguma dica? Alguém passou por este tipo de dificuldades?
Se nada funcionar vou ter de ir lá com o ferro de soldar. :muscle:
Obrigado desde já!


Copyright © 2017-2021. Todos os direitos reservados
CPHA.pt - info@cpha.pt


FAQ | Termos de Serviço/Regras | Política de Privacidade