Suporte das Yale YMC 420W ou YMF 40A no ZHA?

Fala pessoal!

Encontrei no canal do Patte Tech alguns vários tutoriais com essas fechaduras, mas relacionados sempre ao Zigbee2MQTT… E, fora os materiais dele, nada muito relevante sobre essas fechaduras Zigbee no Home Assistant.

No banco do BlakAdder eu encontrei alguns outros modelos da Yale com suporte ao ZHA (algumas da linha YRD e YRL), mas não esses modelos que estão sendo ofertados no Brasil.

Por acaso alguém tem dessas fechaduras e conseguiu fazer funcionar no ZHA? Não queria trocar meu setup inteiro de ZB só por causa da fechadura rsssss

2 curtidas

A minha é YMC 420D e está rodando bem com o seguinte custom quirk:

/config/custom_zha_quirks/realliving_mod.py

"""Device handler for Yale Real Living."""
from zigpy.profiles import zha
from zigpy.quirks import CustomDevice
from zigpy.zcl.clusters.closures import DoorLock
from zigpy.zcl.clusters.general import Basic, Time, Identify, Groups

from zhaquirks.const import (
    DEVICE_TYPE,
    ENDPOINTS,
    INPUT_CLUSTERS,
    MODELS_INFO,
    OUTPUT_CLUSTERS,
    PROFILE_ID,
)


class YMC420D(CustomDevice):
    """Yale YMC 420 D Locks."""

    signature = {
        #  <SimpleDescriptor endpoint=1 profile=260 device_type=10
        #  device_version=0
        #  input_clusters=[0, 3, 4, 257, 4111]
        #  output_clusters=[0, 3, 4, 257, 4111]>
        MODELS_INFO: [("Yale", "YMC 420 D")],
        ENDPOINTS: {
            1: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: zha.DeviceType.DOOR_LOCK,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    Identify.cluster_id,
                    Groups.cluster_id,
                    DoorLock.cluster_id,
                    0x100f,
                ],
                OUTPUT_CLUSTERS: [
                    Basic.cluster_id,
                    Identify.cluster_id,
                    Groups.cluster_id,
                    DoorLock.cluster_id,
                    0x100f,
                ],
            }
        },
    }

    replacement = {
        ENDPOINTS: {
            1: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: zha.DeviceType.DOOR_LOCK,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    Identify.cluster_id,
                    Groups.cluster_id,
                    Time.cluster_id,
                    DoorLock.cluster_id,
                    0x100f,
                ],
                OUTPUT_CLUSTERS: [
                    Basic.cluster_id,
                    Identify.cluster_id,
                    Groups.cluster_id,
                    Time.cluster_id,
                    DoorLock.cluster_id,
                    0x100f,
                ],
            }
        }
    }

1 curtida

Olá @w35l3y, você conseguiu incluir o monitoramento da bateria?

Opa… Nem tentei.
Não sei nem se tem esse recurso na minha YMC 420D.
Se tiver, não deve ser difícil acrescentar.

Show! Esse quirk foi vc quem montou, ou já tem alguma issue pra gente acompanhar?

Fui eu quem montei baseado nesse código que existe:

Não cheguei a criar issue porque só fiz a parte que me interessava.

2 curtidas

Olá @igorsantos07 conseguiu acertar a configuração da fechadura yale? Se sim poderia compartilhar por favor. Tenho uma YMF40A-RL e não consigo fazer funcionar no Ha pelo Zigbbe2mqtt. tenho uma outra YDF40A que está funcionando normal mas essa YMF40A n"ao consigo.

tenho uma ymf40a-RL i usei um external converter yale.js segue o post que utilizei para configurar

Show! Espero que dê pra aproveitar isso no ZHA - que é a interface original do post hahah

Eu só recebi o apartamento agora, e vou me aventurar com a configuração da fechadura no HA nos próximos meses (ainda tenho reformas pra fazer).
Espero que dê pra usar no ZHA localmente, sem ter muito perrengue, pq realmente não queria ter que migrar pro Z2M, que parece ser bem mais complexo rs

Só parece. Z2M não tem complicação

É bem tranquilo configurar o add-on, depois que configura certinho não tem erro!
Não sei se o ZHA tem suporte pras fechaduras, no caso do Z2M a 420W não aparecem os ID dos usuários que usaram a fechadura. Já foi aberto pedido no github da integração mas como ninguém deu atenção ou nenhum dev pegou pra resolver, o issue acabou sendo fechado automaticamente por tempo.

Sou novo aqui na comunidade e no uso do HA, mas aos poucos estou conseguindo colocar as coisas para funcionar. Eu tenho o HA rodando em uma máquina virtual.

Hoje recebi meu Adaptador Usb Sonoff Zigbee 3.0 e estou colocando os equipamentos com suporte ao Zigbee para funcionar usando o ZHA. Entre eles uma fechadura Yale YMC 420W.

Eu consigo travar/destravar a fechadura pelo HA e eu criei uma automação para me notificar quando a fechadura é aberta (trigger “Yale YMC420 unlocked”) através do keypad ou usando a impressão digital.

O que eu não consegui fazer funcionar foi:

  1. receber o status da bateria,
  2. receber o ID do usuário que está abrindo a porta

Alguém tem sugestões de como obter essas informações? Eu li esse post, mas não entendi como a solução poderia se adaptar ao meu caso.

Qualquer link ou sugestão que me ajude a encontrar mais informações é bem vindo.

Obrigado!

O sensor da bateria pra mim aparece, os ID de usuário até hoje não recebo. O issue no github da integração fechou pq ninguém se interessou em resolver o problema.

Obrigado, pelo update.

No seu caso, vc conseguiu receber o status da baterial com o ZHA? Pq eu não tive sucesso com o ZHA, mas depois de postar a pergunta eu refiz tudo usando o Z2M, e aí o status da bateria apareceu, porém os IDs do usuários continuam vazios.

Nem tentei, não uso o ZHA, acho ele limitado por ter suporte a muito menos dispositivos.

Melhor coisa que vc fez, o Z2M tem suporte a + dispositivos.

Precisamos de alguém que tenha a fechadura e que entenda de programação pra conseguir dar esse suporte, foi aberto o “issue” no github mas como ninguém apareceu pra dar esse suporte ele acabou fechando com o tempo.

Eu achei essa discussão: https://github.com/Koenkk/zigbee2mqtt/issues/8946

Nela é apresentada uma solução com um “external converter”, que consegue recuperar o id do usuário que está desbloqueando a porta. Não é a solução, porém já é meio caminho andado.

No meu caso, eu testei a solução e eu consigo recuperar o id através da entidade “action_source_user”, porém por alguma razão eu não consigo usar essa informação dentro de uma automação.

Como fez? Explica por favor

Boa tarde,

Segue o passo-a-passo que funcionou para mim:

  1. Ativar o “Modo Avançado” no HA;

  2. Instalar os add-ons “File Editor” e “Terminal & SSH”. Eles são importantes para fazer edições e acessar a estrutura de arquivos do HA;

  3. Crie o diretório para receber o external_converte: (peguei o passo-a-passo aqui Z2MQTT External converter - #6 by ynnor666 - Zigbee - Home Assistant Community)

    Abra add-on “Terminal” e use os comandos abaixo

        cd /homeassistant
        cd zigbee2mqtt
        mkdir external_converters
        cd external_converters
        touch converter.js
  1. Abra o arquivo “converter.js” usando o add-on “File Editor” e cole o código abaixo (que eu retirei daqui https://github.com/Koenkk/zigbee2mqtt/issues/8946#issuecomment-2825798436).

    Eu tive que fazer alguns ajustes para funcionar com a minha fechadura.

const fz = require("zigbee-herdsman-converters/converters/fromZigbee");
const tz = require("zigbee-herdsman-converters/converters/toZigbee");
const exposes = require("zigbee-herdsman-converters/lib/exposes");
const reporting = require("zigbee-herdsman-converters/lib/reporting");

const e = exposes.presets;

const fzLocal = {
 action_source_name: {
   cluster: "closuresDoorLock",
   type: "raw",
   convert: (model, msg, publish, options, meta) => {
     const lookup = {
       0: "password_unlock", // Consegui retorno desse. Desbloqueio por Senha.
       1: "unlock", // Consegui retorno desse. Desbloqueio pelo Home Assistant.
       2: "auto_lock", // Consegui retorno desse. Bloqueio Automático, Botão Interno de Bloqueio ou Bloqueio pelo Numpad da Fechadura.
       3: "RFID_unlock", // Consegui retorno desse. Desbloqueio por Tag / cartão RFID.
       4: "fingerprint_unlock", // Consegui retorno desse. Desbloqueio por Digital.
       5: "unlock_failure_invalid_pin_or_id", // Não consegui retornar.
       6: "unlock_failure_invalid_schedule", // Não consegui retornar.
       7: "one_touch_lock", // Não consegui retornar.
       8: "key_lock", // Não consegui retornar.
       9: "key_unlock", // Não consegui retornar.
       10: "auto_lock", // Não consegui retornar.
       11: "schedule_lock", // Não consegui retornar.
       12: "schedule_unlock", // Não consegui retornar.
       13: "manual_lock", // Não consegui retornar.
       14: "manual_unlock", // Não consegui retornar.
       15: "non_access_user_operational_event", // Não consegui retornar.
     };

     // Debug para ver dados no log do addon do Z2M.
     //console.log("----DEBUG FECHADURA YALE YMC 420W----");
     //console.log("action_source_name RAW ->", msg.data[3]);
     //console.log("action_source_name ->", lookup[msg.data[3]]);
     //console.log("---------------------------------------");
     //console.log("action_source_user RAW ->", msg.data[5]);
     //console.log("---------------------------------------");

     const value = lookup[msg.data[3]];
     return { action_source_name: value };
   },
 },
 action_source_user: {
   cluster: "closuresDoorLock",
   type: "raw",
   convert: (model, msg, publish, options, meta) => {
     return { action_source_user: msg.data[5] };
   },
 },
};

const definition = {
 zigbeeModel: ["YMC420", "YMC 420", "YMC420 W", "YMC 420 W"],
 model: "YMC420-W",
 vendor: "Yale",
 description: "Fechadura Digital YMC 420 W (external converter)",
 meta: {
   pinCodeCount: 250,
   configure: async (device, coordinatorEndpoint, logger) => {
     const endpoint = device.getEndpoint(1);
     await reporting.bind(endpoint, coordinatorEndpoint, [
       "closuresDoorLock",
       "genPowerCfg",
     ]);
     await reporting.lockState(endpoint);
     await reporting.batteryPercentageRemaining(endpoint);
   },
 },
 exposes: [
   e.battery(),
   e.lock(),
   e.pincode(),
   e.lock_action(),
   e.lock_action_source_name(),
   e.lock_action_user(),
   e.auto_relock_time().withValueMin(0).withValueMax(60), // Limitei até 60 segundos (1 minuto)
   e.sound_volume(),
   e.battery_low(),
 ],
 fromZigbee: [
   fzLocal.action_source_user,
   fzLocal.action_source_name,
   fz.lock,
   fz.battery,
   fz.lock_operation_event,
   fz.lock_programming_event,
   fz.lock_pin_code_response,
   fz.lock_user_status_response,
 ],
 toZigbee: [
   tz.lock,
   tz.pincode_lock,
   tz.lock_userstatus,
   tz.lock_auto_relock_time,
   tz.lock_sound_volume,
 ],
};

module.exports = definition;

  1. Usando o File Editor, edite agora o arquivo “/homeassistant/zigbee2mqtt/configuration.yaml” e adicione ao final o seguinte:
external_converters:
 - converter.js
  1. Reinicie o Zigbee2MQTT.
    Com isso, a informação relacionada ao id do usuário deverá aparecer na aba “State” da fechadura, dentro do Zigbee2MQTT. Faça o teste, deixando essa aba aberta e abrindo a fechadura usando a digital, por exemplo.

A próxima etapa é criar uma automação para gerar um alerta quando a porta for aberta e informar como/quem abriu a porta.

  1. Vá para Configuraçãoes → Automações & cenas
  2. Clique em “Criar automação” e na tela que abre, coloque em “Criar automação” novamente
  3. Na tela seguinte, clique nos menu no canto superior direito (com três pontos) e selecione a opção “Editar no YAML
  4. Na tela que se abre cole o código a seguir (me baseei nesse https://github.com/Koenkk/zigbee2mqtt/issues/8946#issuecomment-3033961297):
alias: NOME_DA_AUTOMACAO  #COLOQUE O NOME QUE VC QUISER
description: ""
triggers:
 - trigger: mqtt
   topic: zigbee2mqtt/YMC 420W   #SUBSTITUA O "YMC 420W" PELO NOME DA SUA FECHADURA NO ZIGBEE2MQTT, PRESERVE O RESTANTE
conditions:
 - condition: template
   value_template: |-
     {{ trigger.payload_json.action_source_name is defined and
     trigger.payload_json.action_source_user is defined }}
 - condition: template
   value_template: "{{ trigger.payload_json.action_source_user | int(0) > 0 }}"
actions:
 - action: notify.notify
   metadata: {}
   data:
     message: >
       {% set user_map = { '0': 'Auto-lock', '1': 'USUARIO001', '2': 'USUARIO002', '3':
       'USUARIO003'} %}{% set user_id =
       trigger.payload_json.action_source_user | string%} {{ user_map[user_id]
       if user_id in user_map else 'Desconhecido' }} abriu a porta{% set
       source_map = {'0': 'password', '1': 'unlock', '2': 'autolock', '3':
       'RFID', 'fingerprint_unlock': '(Digital)', 'auto_lock': 'Trava
       Automática', 'keypad': '(Teclado)', 'rfid': '(RFID)', 'manual':
       '(Manual)', 'password_unlock': '(Teclado)' }%}{% set source_name =
       trigger.payload_json.action_source_name | string %}
       {{source_map[source_name] if source_name in source_map else source_name
       | default('Desconhecido')}}.
mode: single
  1. Salve a automação e depois tente abrir a porta usando alguns dos métodos cadastrados. Importante se atentar que na mensagem estão identificados os 3 primeiros usuários, você editar o nome deles e adicionar mais usuários, seguindo o formato ‘NUMERO’: ‘NOME’. Similar aos que já existem.

Espero que funcione para você também!

2 curtidas

Oi amigo, consegui fazer até aqui!

Consegui fazer funcionar a automação, coloquei o telegram no notify.notify e mudei os nomes no USUARIO001…

Vlw pela ajuda!!

Amigo, como seria essa automação usando o Node-RED? Saberia ajudar?