Boa tarde,
Segue o passo-a-passo que funcionou para mim:
-
Ativar o “Modo Avançado” no HA;
-
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;
-
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
-
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;
- Usando o File Editor, edite agora o arquivo “/homeassistant/zigbee2mqtt/configuration.yaml” e adicione ao final o seguinte:
external_converters:
- converter.js
- 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.
- Vá para Configuraçãoes → Automações & cenas
- Clique em “Criar automação” e na tela que abre, coloque em “Criar automação” novamente
- Na tela seguinte, clique nos menu no canto superior direito (com três pontos) e selecione a opção “Editar no YAML”
- 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
- 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!