Zigbee2mqtt ajout appareil TuYa qui n'est pas reconnu

Mon problème

J’essaie de créer un nouvel appareil fonctionnant sous TuYa qui n’est pas dans la liste des appareils reconnus :unamused:

un capteur d’ouverture de porte. Il apparaît dans les logs de zigbee2mqtt comme :
Modèle Zigbee ‹ TS0601 › et nom du fabricant ‹ _TZE200_pay2byax ›
Voici ce que j’ai fait:
créé un fichier json et ajouté 3 lignes dans la configuration Z2M

déjà une erreur en ligne 29, mais quoi ? :roll_eyes:

3 fichiers

si vous pouviez m’aider à comprendre ce serait super. :blush:

Ma configuration


System Health

version core-2022.4.3
installation_type Home Assistant OS
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.9.9
os_name Linux
os_version 5.10.103-v8
arch aarch64
timezone Europe/Brussels
Home Assistant Cloud
logged_in false
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Home Assistant Supervisor
host_os Home Assistant OS 7.6
update_channel stable
supervisor_version supervisor-2022.04.0
docker_version 20.10.9
disk_total 465.0 GB
disk_used 10.1 GB
healthy true
supported true
board rpi4-64
supervisor_api ok
version_api ok
installed_addons File editor (5.3.3), Mosquitto broker (6.0.1), Zigbee2mqtt (1.18.1-1)
Dashboards
dashboards 1
resources 0
mode auto-gen
___

Pour l’erreur de la ligne 29, il te manque une } ligne 36 pour terminer la fonction configure

oui merci Tof
Mais maintenant j’ai ceci


ligne 29 erreur : Expected ‹ ( › and instead saw ‹ { › :face_with_diagonal_mouth:

Oui, bon, c’est du JavaScript :blush:. Je ne peux pas te dire si ton bout de code ça fonctionner, mais effectivement, il faut rajouter une ( avant ton { ligne 29, et mettre son pendant ) après le } ligne 36.

Mis à part faire beau, ça ne changera absolument rien dans son cas.

Ton try/catch ne sert pas à grand chose non plus car les erreurs sont automatiquement remontées dans zigbee-herdsman.
Surveille également ton indentation ligne 31 à 36

He bien, si c’est vraiment du JS, je pense que si.
Une fonction flèche s’attend par défaut à renvoyer une réponse.

Function(a) {
  return { value : a+1 }
}

On peut l’écrire :

(a) => { value: a+1 }

On renvoie ici un objet.
Si le code entre {} dans le cas de la fonction flèche n’est pas un objet, mais des expressions, alors il faut entourer de ()

Enfin, j’ai toujours codé comme ça :blush:
ÉDIT j’ai dit n’importe quoi. :joy:
C’est l’inverse. C’est quand on doit renvoyer un objet qu’il faut des parenthèses. Pffff ça fait trop longtemps que j’ai pas fait de JS moi…
Désolé pour le spam.

Du coup, pour revenir ce que tu disais, voici la source provenant du site developer.mozilla.org (tu pourras le mettre en favoris :stuck_out_tongue: ) :

// fonction() renverra undefined !
var fonction = () => { toto: 1 };

// SyntaxError
var fonction2 = () =>  { toto: function () {} };

En effet, ici, l’analyse de l’expression trouve des blocs d’instructions au lieu de littéraux objets. Pour éviter cet effet indésirable, on pourra encadrer le littéral objet :

var fonction = () => ({ toto: 1 });

c’est un peu trop tordu pour moi, désolé.
si j’essaie de te suivre je mets ‹ ( › en fin de ligne 29 devant ‹ { › et un ‹ ) › en ligne 36 derrière ‹ } ›
mais visiblement c’est pas ça que je dois faire.

en fait j’ai ajouter et/ou modifier un fichier existant pour un Door sensor comme ceci :

zigbeeModel: [‹ TS0203 ›],
model: ‹ TS0203 ›,
vendor: ‹ TuYa ›,
description: ‹ Door sensor ›,
fromZigbee: [fz.ias_contact_alarm_1, fz.battery, fz.ignore_basic_report, fz.ias_contact_alarm_1_report],
toZigbee: ,
exposes: [e.contact(), e.battery_low(), e.tamper(), e.battery(), e.battery_voltage()],
whiteLabel: [{vendor: ‹ CR Smart Home ›, model: ‹ TS0203 ›}],
configure: async (device, coordinatorEndpoint, logger) => {
try {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, [‹ genPowerCfg ›]);
await reporting.batteryPercentageRemaining(endpoint);
await reporting.batteryVoltage(endpoint);
} catch (error) {/* Fails for some*/}
},

que j’ai piqué sur le site https://github.com/Koenkk/zigbee-herdsman-converters/tree/master/devices
et dans le fichier TuYa j’ai choisi un devices se rapprochant de mon capteur.

Et en partant du fichier exemple pour TuYa en json j’ai fait un mix

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 extend = require(‹ zigbee-herdsman-converters/lib/extend ›);
const e = exposes.presets;
const ea = exposes.access;
const tuya = require(« zigbee-herdsman-converters/lib/tuya »);

const definition = {
// Since a lot of Tuya devices use the same modelID, but use different data points
// it’s usually necessary to provide a fingerprint instead of a zigbeeModel
fingerprint: [
{
// The model ID from: Device with modelID ‹ TS0601 › is not supported
// You may need to add \u0000 at the end of the name in some cases
modelID: ‹ TS0601 ›,
// The manufacturer name from: Device with modelID ‹ TS0601 › is not supported.
manufacturerName: ‹ _TZE200_c88teujp ›
},
],
model: ‹ SEA802-Zigbee ›,
vendor: ‹ Saswell ›,
description: ‹ Thermostatic radiator valve ›,
fromZigbee: [
fz.ignore_basic_report, // Add this if you are getting no converter for ‹ genBasic ›
fz.tuya_data_point_dump, // This is a debug converter, it will be described in the next part
],
toZigbee: [
tz.tuya_data_point_test, // Another debug converter
],
onEvent: tuya.onEventSetTime, // Add this if you are getting no converter for ‹ commandMcuSyncTime ›
configure: async (device, coordinatorEndpoint, logger) => {
const endpoint = device.getEndpoint(1);
await reporting.bind(endpoint, coordinatorEndpoint, [‹ genBasic ›]);
},
exposes: [
// Here you should put all functionality that your device exposes
],
};

module.exports = definition;

A noter qu’avec le fichier exemple sur Support new Tuya devices | Zigbee2MQTT
j’ai aussi des erreurs au meme endroit

pour être sûre c’est lequel que je dois installer.

Zigbee2mqtt c’est la version « stable ». Zigbee2mqtt Edge, c’est la version « dev »

donc pour ce qui me concerne c’est bien la stable que je dois choisir.
Merci Carthage

et bien non en utilisant Zigbee2mqtt Edge (développement) mon capteur est reconnu comme dans la version 1.17.1 edge
un tas d’appareils ne sont pas encore officiellement dans la version stable, si j’ai bien compris.
J’aurais bien voulu le créer moi-même mais c’est trop compliqué. Surtout pour les TuYa.
Merci quand même pour votre aide. :+1:

A mon tour je cherche un ajouter un nouveau device :


Je pense que je trouverai converter suffisamment proche pour le faire tourner,…
J’ai commencer a suivre la doc :

Mais j’ai un problème déjà des le debut,…
Apres avoir créer le converteur JS à côté de configuration.yaml et de l’avoir inclu dans mon configuration.yaml de Z2M

Je n’ai pas l’erreur que je devrait avoir selon la doc,…

No converter available for 

voici mon fichier ‹ zigbee2mqtt>TS0601meter.js ›


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 extend = require('zigbee-herdsman-converters/lib/extend');
const e = exposes.presets;
const ea = exposes.access;

const definition = {
    zigbeeModel: ['TS0601'], // The model ID from: Device with modelID 'lumi.sens' is not supported.
    model: 'TS0601meter', // Vendor model number, look on the device for a model number
    vendor: 'MatSee Plus', // Vendor of the device (only used for documentation and startup logging)
    description: 'Tuya  ', // Description of the device, copy from vendor site. (only used for documentation and startup logging)
    fromZigbee: [fz.tuya_dinrail_switch], // We will add this later
    toZigbee: [], // Should be empty, unless device can be controlled (e.g. lights, switches).
    exposes: [e.energy(), e.current(), e.power(), e.voltage()], // Defines what this device exposes, used for e.g. Home Assistant discovery and in the frontend
};


module.exports = definition;

et donc mon fichier de config :

data_path: /config/zigbee2mqtt
socat:
  enabled: false
  master: pty,raw,echo=0,link=/tmp/ttyZ2M,mode=777
  slave: tcp-listen:8485,keepalive,nodelay,reuseaddr,keepidle=1,keepintvl=1,keepcnt=5
  options: "-d -d"
  log: true
mqtt:
  base_topic: zigbee2mqtt
  server: mqtt://192.168.1.xxxxx:1883
  user: xxxxxxxxxxxx
  password: xxxxxxxx
serial:
  port: /dev/ttyACM0
  adapter: deconz
zigbee_herdsman_debug: true
advanced:
  log_level: debug
external_converters:
  - TS0601meter.js

J’ai donc du raté quelque chose dans cette première étape

Il suffit que je pulbie mon post pour trouver la solution,… Je viens d’apprendre que
la config de l’addon Z2M n’est pas identique au fichier configuration.yaml,…

Dans mon cas le convertisseur doit etre simple a faire :

Zigbee2MQTT:debug 2022-11-30 16:07:02: No converter available for 'TS0601meter' with cluster 'manuSpecificTuya' and type 'raw' and data '{"data":[9,86,37,241,0],"type":"Buffer"}'

c’est juste un raw et j’ai les donnés sous les yeux là
J’essai tout d’abord de récupérer la premier donnée de mon RAW :

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 extend = require('zigbee-herdsman-converters/lib/extend');
const e = exposes.presets;
const ea = exposes.access;

const fzLocal = {
    energy_datas: {
        cluster: 'manuSpecificTuya',
        type: ['raw'],
        convert: (model, msg, publish, options, meta) => {
            const result = {};
            return {energy: msg.data[1]};
        },        
    },
};

const definition = {
    zigbeeModel: ['TS0601'], // The model ID from: Device with modelID 'lumi.sens' is not supported.
    model: 'TS0601meter', // Vendor model number, look on the device for a model number
    vendor: 'MatSee Plus', // Vendor of the device (only used for documentation and startup logging)
    description: 'Tuya  ', // Description of the device, copy from vendor site. (only used for documentation and startup logging)
    fromZigbee: [fzLocal.energy_datas], // We will add this later
    toZigbee: [], // Should be empty, unless device can be controlled (e.g. lights, switches).
    exposes: [e.energy(), e.current(), e.power(), e.voltage()], // Defines what this device exposes, used for e.g. Home Assistant discovery and in the frontend
};


module.exports = definition;

ca marche,… Je suis surpris de la simplicité,…