Module pour périphériques Tuya et/ou Smart Life


#1

Après avoir fait l’acquisition d’interrupteurs wifi pour piloter mes volets roulants (exemple ici), je me suis lancé dans la création d’un module pour Gladys.

Et voila le résultat :

Si des personnes ont des périphériques pilotés via l’application Tuya ou Smart Life (exemple ici), je peux ajouter leurs prise en charge dans ce module :wink:


Interrupteur connectés volets roulants
#2

Bonjour à tous, nouveau venu dans la communauté Gladys, je m’éclate comme un fou avec toutes vos idées ! Même si jusqu’à présent, je n’ai pas pris la peine de vous l’écrire ;o)

Ceci étant dit, je rebondi de ce post justement, ayant acquis quelques plug wifi.

Avis à toi Pti_Nico, j’ai fouiné un peu le code, réussi à insérer mes plugs dans la config, dé-commenté la ligne correspondant aux ‘plug’ dans le fichier utils.js, mais je bloque un peu là.

Phase d’install ok, mes devices sont bien créés via le module et son bouton de configuration. Mais à partir de là, il doit me manquer quelque chose, je tombe là dessus : TypeError: Cannot read property ‘key’ of undefined

Un peu d’aide serait la bienvenue.


#3

Salut @Larsouille,

Sans code ni log cela reste compliqué de t’aider :

Je te laisse lire le poste de @C4rlit0 à ce sujet.

Pour t’aider, tu tentes d’accéder à la propriété “key” d’un truc null
C’est a dire que dans l’exemple suivant truc vaut null :
Gladys.truc.key


#4

Merci @spenceur pour ton retour, je me disais bien aussi, il manque des infos…
N’étant pas au top niveau forum ou chat, je vais essayer de faire au mieux donc.

Gladys à jour pour moi (3.12.1), raspi 3+, npm 6.4.1, node 8.9.4.

mon fichier conf. pour tuya :
devices: [
{ id: ‘01200******’, key: ‘******’, name: ‘Plug 1’, type: ‘plug’ }, // Prise 1
{ id: ‘03200******’, key: ‘******’, name: ‘Plug 2’, type: ‘plug’ }, // Prise 2
{ id: ‘03200******’, key: ‘******’, name: ‘Plug 3’, type: ‘plug’ }, // Prise 3
{ id: ‘01200******’, key: ‘******’, name: ‘Plug 4’, type: ‘plug’ }, // Prise 4

les logs quand je tente une action sur un des interrupteur créés via la config du module :

2019-02-22-12:19:26 0|gladys            | Sending 500 ("Server Error") response:
2019-02-22-12:19:26 0|gladys            |  TypeError: Cannot read property 'key' of undefined
2019-02-22-12:19:26 0|gladys            |     at Hook.exec (/home/pi/gladys/api/hooks/tuya/lib/exec.js:8:58)
2019-02-22-12:19:26 0|gladys            |     at Hook.wrapper [as exec] (/home/pi/gladys/node_modules/@sailshq/lodash/lib/index.js:3275:19)
2019-02-22-12:19:26 0|gladys            |     at /home/pi/gladys/api/core/devicetype/deviceType.exec.js:60:47
2019-02-22-12:19:26 0|gladys            |     at tryCatcher (/home/pi/gladys/node_modules/bluebird/js/release/util.js:16:23)
2019-02-22-12:19:26 0|gladys            |     at Promise._settlePromiseFromHandler (/home/pi/gladys/node_modules/bluebird/js/release/promise.js:512:31)
2019-02-22-12:19:26 0|gladys            |     at Promise._settlePromise (/home/pi/gladys/node_modules/bluebird/js/release/promise.js:569:18)
2019-02-22-12:19:26 0|gladys            |     at Promise._settlePromise0 (/home/pi/gladys/node_modules/bluebird/js/release/promise.js:614:10)
2019-02-22-12:19:26 0|gladys            |     at Promise._settlePromises (/home/pi/gladys/node_modules/bluebird/js/release/promise.js:693:18)
2019-02-22-12:19:26 0|gladys            |     at Promise._fulfill (/home/pi/gladys/node_modules/bluebird/js/release/promise.js:638:18)
2019-02-22-12:19:26 0|gladys            |     at /home/pi/gladys/node_modules/bluebird/js/release/nodeback.js:42:21
2019-02-22-12:19:26 0|gladys            |     at /home/pi/gladys/node_modules/sails-mysql/lib/connections/spawn.js:120:16
2019-02-22-12:19:26 0|gladys            |     at Object.poolfully [as releaseConnection] (/home/pi/gladys/node_modules/sails-mysql/lib/connections/release.js:28:12)
2019-02-22-12:19:26 0|gladys            |     at Query._callback (/home/pi/gladys/node_modules/sails-mysql/lib/connections/spawn.js:105:35)
2019-02-22-12:19:26 0|gladys            |     at Query.Sequence.end (/home/pi/gladys/node_modules/mysql/lib/protocol/sequences/Sequence.js:96:24)
2019-02-22-12:19:26 0|gladys            |     at Query._handleFinalResultPacket (/home/pi/gladys/node_modules/mysql/lib/protocol/sequences/Query.js:144:8)
2019-02-22-12:19:26 0|gladys            |     at Query.EofPacket (/home/pi/gladys/node_modules/mysql/lib/protocol/sequences/Query.js:128:8)
2019-02-22-12:19:26 0|gladys            |     at Protocol._parsePacket (/home/pi/gladys/node_modules/mysql/lib/protocol/Protocol.js:280:23)
2019-02-22-12:19:26 0|gladys            |     at Parser.write (/home/pi/gladys/node_modules/mysql/lib/protocol/Parser.js:73:12)
2019-02-22-12:19:26 0|gladys            |     at Protocol.write (/home/pi/gladys/node_modules/mysql/lib/protocol/Protocol.js:39:16)
2019-02-22-12:19:26 0|gladys            |     at Socket.<anonymous> (/home/pi/gladys/node_modules/mysql/lib/Connection.js:96:28)
2019-02-22-12:19:26 0|gladys            |     at emitOne (events.js:116:13)
2019-02-22-12:19:26 0|gladys            |     at Socket.emit (events.js:211:7)
2019-02-22-12:19:26 0|gladys            |     at addChunk (_stream_readable.js:263:12)
2019-02-22-12:19:26 0|gladys            |     at readableAddChunk (_stream_readable.js:250:11)
2019-02-22-12:19:26 0|gladys            |     at Socket.Readable.push (_stream_readable.js:208:10)
2019-02-22-12:19:26 0|gladys            |     at TCP.onread (net.js:594:20)
2019-02-22-12:19:26 0|gladys            | Server Error:
2019-02-22-12:19:26 0|gladys            | TypeError: Cannot read property 'key' of undefined
2019-02-22-12:19:26 0|gladys            |     at Hook.exec (/home/pi/gladys/api/hooks/tuya/lib/exec.js:8:58)
2019-02-22-12:19:26 0|gladys            |     at Hook.wrapper [as exec] (/home/pi/gladys/node_modules/@sailshq/lodash/lib/index.js:3275:19)
2019-02-22-12:19:26 0|gladys            |     at /home/pi/gladys/api/core/devicetype/deviceType.exec.js:60:47
2019-02-22-12:19:26 0|gladys            |     at tryCatcher (/home/pi/gladys/node_modules/bluebird/js/release/util.js:16:23)
2019-02-22-12:19:26 0|gladys            |     at Promise._settlePromiseFromHandler (/home/pi/gladys/node_modules/bluebird/js/release/promise.js:512:31)
2019-02-22-12:19:26 0|gladys            |     at Promise._settlePromise (/home/pi/gladys/node_modules/bluebird/js/release/promise.js:569:18)
2019-02-22-12:19:26 0|gladys            |     at Promise._settlePromise0 (/home/pi/gladys/node_modules/bluebird/js/release/promise.js:614:10)
2019-02-22-12:19:26 0|gladys            |     at Promise._settlePromises (/home/pi/gladys/node_modules/bluebird/js/release/promise.js:693:18)
2019-02-22-12:19:26 0|gladys            |     at Promise._fulfill (/home/pi/gladys/node_modules/bluebird/js/release/promise.js:638:18)
2019-02-22-12:19:26 0|gladys            |     at /home/pi/gladys/node_modules/bluebird/js/release/nodeback.js:42:21
2019-02-22-12:19:26 0|gladys            |     at /home/pi/gladys/node_modules/sails-mysql/lib/connections/spawn.js:120:16
2019-02-22-12:19:26 0|gladys            |     at Object.poolfully [as releaseConnection] (/home/pi/gladys/node_modules/sails-mysql/lib/connections/release.js:28:12)
2019-02-22-12:19:26 0|gladys            |     at Query._callback (/home/pi/gladys/node_modules/sails-mysql/lib/connections/spawn.js:105:35)
2019-02-22-12:19:26 0|gladys            |     at Query.Sequence.end (/home/pi/gladys/node_modules/mysql/lib/protocol/sequences/Sequence.js:96:24)
2019-02-22-12:19:26 0|gladys            |     at Query._handleFinalResultPacket (/home/pi/gladys/node_modules/mysql/lib/protocol/sequences/Query.js:144:8)
2019-02-22-12:19:26 0|gladys            |     at Query.EofPacket (/home/pi/gladys/node_modules/mysql/lib/protocol/sequences/Query.js:128:8)
2019-02-22-12:19:26 0|gladys            |     at Protocol._parsePacket (/home/pi/gladys/node_modules/mysql/lib/protocol/Protocol.js:280:23)
2019-02-22-12:19:26 0|gladys            |     at Parser.write (/home/pi/gladys/node_modules/mysql/lib/protocol/Parser.js:73:12)
2019-02-22-12:19:26 0|gladys            |     at Protocol.write (/home/pi/gladys/node_modules/mysql/lib/protocol/Protocol.js:39:16)
2019-02-22-12:19:26 0|gladys            |     at Socket.<anonymous> (/home/pi/gladys/node_modules/mysql/lib/Connection.js:96:28)
2019-02-22-12:19:26 0|gladys            |     at emitOne (events.js:116:13)
2019-02-22-12:19:26 0|gladys            |     at Socket.emit (events.js:211:7)
2019-02-22-12:19:26 0|gladys            |     at addChunk (_stream_readable.js:263:12)
2019-02-22-12:19:26 0|gladys            |     at readableAddChunk (_stream_readable.js:250:11)
2019-02-22-12:19:26 0|gladys            |     at Socket.Readable.push (_stream_readable.js:208:10)
2019-02-22-12:19:26 0|gladys            |     at TCP.onread (net.js:594:20)

Je précise que j’ai modifié le utils.js, contenu dans api/hooks/tuay/lib, pour décommenter cette ligne

{ id: 'plug', description: 'WiFi plug', deviceTypes: [
  { name: 'Plug', type: 'binary', category: '', identifier: 'power', sensor: false, min: 0, max: 1 }
] },

Si besoin de plus, je reste à l’écoute.
Pour mieux rédiger mes posts, je reste aussi à l’écoute ;o)


#5

Nickel merci @Larsouille pour ta réactivité :slight_smile: !
ça aidera grandement pour faire du debug :slight_smile:

Peux tu me donner l’identifier du deviceType que tu tentes d’executer ? stp :slight_smile:
et peux tu vérifier que dans fichier de conf tu retrouves bien cet identifier dans KEY ?

Dans ton cas tu as une erreur sur ces lignes :

const config = require('../config.js');
[...]
const id = params.deviceType.identifier;
const device = new TuyaDevice({ id: id, key: config[id].key });

la première récupère identifier de ton deviceType “actionné” et stock l’info dans la viariable id puis utilise cette variable dans la seconde ligne pour trouver la key du device dans ton fichier de configuration à la racine du module.


#6

Maintenant que je regarde par rapport à tes précisions, je constate que les identifier listés dans mes devices correspondent aux ‘id’, pas aux ‘key’.

Pour les deviceType, ils sont bien créés en identifier -> ‘power’, comme dans le modèle présent dans utils.js.


#7

Je suppose que tu rencontres tjrs un problème du coup ?
Si oui envoie un screen de ton deviceType qui pose problème stp.


#8

Les deviceType ont été créés de manière autonome je précise, via le module. Je n’ai rien changé dans Gladys, juste les .js dans le dossier hook.

En regardant un peu de plus près le git gladys-tuya, étape 6, list of ID and key pairs, on parle de MAC adress des devices trouvés via tuya-cli list-app.
Et curieusement, en passant par ma box pour repérer mes plugs (à base d’esp), les adress MAC ne correspondent pas du tout. Mais peut-être est-ce normal.


#9

Salut @Larsouille et merci pour ton retour.

Si tu as bien suivi la procédure, tu as du récupérer l’ID et la key de tes périphériques.
Dans mon cas, les ID (“07607580xxxxxxxxxxxx”) sont composés d’un préfixe “07607580”, suivi de l’adresse MAC “xxxxxxxxxxxx” du périphérique. Peut-être que pour toi, ce n’est pas le cas.

Il faut les ajouter dans le fichier de conf (comme ci-dessous):

  devices: [
    { id: '01200997xxxxxxxxxxxx', key: 'xxxxxxxxxxxxxxxx', name: 'Plug 1', type: 'plug' },
    { id: '03200172xxxxxxxxxxxx', key: 'xxxxxxxxxxxxxxxx', name: 'Plug 2', type: 'plug' },
    ...
  ],

La création des périphériques se fait en fonction de ce que tu auras renseigné dans le fichier de conf.

Comme l’a précisé @spenceur, la ligne suivante:

const device = new TuyaDevice({ id: id, key: config[id].key });

permet de créer le “TuyaDevice” à partir de l’ID et de la key (récupérée dans le fichier de conf) et ensuite d’exécuter la commande envoyée.

Si tu le souhaite, je peux ajouter des log dans le code, pour te permettre de trouver l’origine du problème.