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.


#10

@Larsouille, où en es-tu avec le module?
Ça fonctionne maintenant?


#11

Absent ces derniers jours, je n’ai pas encore pu rejouer avec ma bête… Mais ça ne va pas tarder. Je vous informe promis, avec logs et tout s’il faut ;o)

@Pti_Nico : J’ai recommencé quelques tests ce week-end, sans succès. Du coup, en repartant de zéro, sans aucune modif concernant les fichiers de conf, je me retrouve avec la même erreur, chose curieuse à mon avis… Qu’en penses-tu ?


#12

@Larsouille,
essai en remplaçant la ligne :

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

par

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

Je pense que le problème vient de là…


#13

@Pti_Nico Toujours le même résultat… pas d’évolution dans mes logs.

Petite question au cas ou : Tu as installé le package codetheweb/tuyapi en amont de ton côté ? ça peut paraître idiot, mais il me manque peut-être des dépendances liées à ça en fin de compte. Si oui, à partir de quel dossier ?


#14

Il est en dépendance dans le package.json du projet et est importé lors du npm install, normalement.

Je viens de voir que la version 4.0.x était sortie y’a peu, je vais l’intégrer…


#15

Salut,

Je suis sur le point de me mettre doucement en route sur Gladys dans la préparation d’un nouvelle aménagement. J’ai des prises smart life donc ton plug-in me sera utile merci !
Je suis développeur node js donc si besoin je participerait peut être à son amélioration :slight_smile:

J’ai pour projet d’intégrer un Magic Mirrror et un Farm.bot à mon Gladys donc j’ai du travail et des sous à investire haha.

Bonne journée.


#16

Salut @PrincesseLulu, bienvenue sur le projet :wink:

Si tu veux contribuer au module, pas de soucis, j’ai déjà développé une partie pour des interrupteurs de volet roulant et laissé en standby pour les autres types de périphériques (vu que je ne peux pas tester…).


#17

Ouais pour l’instant j’ai juste des prises connectés, mais j’avou que j’aimerais bien avoir des intérupteurs wifi pour les relier à mes prises, ta des produits à me conseiller là dessus ?


#18

Pour info, j’ai fait quelques modifications, sur ma branche develop, du module, dont l’upgrade de la librairie TuyaApi.


#19

Salut @Pti_Nico :wave:

Pas eu trop de temps pour me repencher sur ce sujet depuis 10 jours, mais je m’y remet depuis hier…
Et donc : J’ai tenté l’installation du module via Gladys, juste de la branche devellop, mais sans succès. Et je ne vois pas comment faire pour embarquer cette branche (proprement) pour la tester.
Si tu peux éclairer ma lanterne, je suis preneur ;o)


#20

Salut @Larsouille,

Pour installer la branche develop, il faut dans un premier temps que le module original soit installé.
Tu peux le faire à la main via le menu Modules de Gladys, onglet Avancé, avec les options suivantes :
Nom: Tuya
Version: 0.1.0
Url: https://github.com/NickDub/gladys-tuya.git
Slug: tuya

Ensuite, il faut aller dans le dossier d’installation du module /home/pi/gladys/api/hooks/tuya de ton RPI, et exécuter les commandes suivantes, pour récupérer le contenu de la branche develop :

git checkout develop

puis installer les dépendances :

npm install

Et voila, il ne reste plus qu’à redémarrer Gladys pour profiter du module :wink: