Module Yeelight


#1

Hello !

La première version du module Yeelight est dispo. Le module est encore très sommaire mais ça devrait suffire pour combler l’attente avant une version plus évoluée. Il permet actuellement, via la section Devices, d’allumer/éteindre les lampes, de changer leur nom (via le champ ‘Nom’ de la page Devices puis un reboot) et bien évidemment de régler leur intensité/teinte/saturation. La plupart des fonctions de l’API Yeelight sont implémentées mais ne sont pas encore accessibles (set_rgb, set_scene, set_adjust, etc). Elles le deviendront probablement par la suite via les scripts (je préfère ne pas surcharger la page des Devices pour des résultats qu’on peut déjà obtenir via le combo brightness/hue/saturation).

Pour l’installation, une fois le module installé et Gladys rebooté, il suffit de cliquer sur le bouton Config sur la page des modules. Le scan dure 8 secondes. Il arrive parfois que ça ne fonctionne pas, il suffit de répéter cette étape. Ne pas oublier également d’indiquer les pièces où sont situées les ampoules via la page Devices afin que les contrôles s’affichent bien.

[size=150]MODULE YEELIGHT[/size]

A venir pour la suite (très dépendant de ma compréhension de Gladys) :
[color=#008040]- Rendre le reste des fonctions de l’API Yeelight accessibles via Gladys
[/color]- Implémenter la fonction set_music et la rendre compatible avec la gestion native de musique de Gladys si possible

  • Différencier les ampoules blanches et RGB (les contrôles de couleurs s’affichent sans distinction)
  • Ajout du support des ampoules et lampes Yeelight bluetooth (très éventuel)
  • Mise à jour automatique des deviceState à l’init de Gladys au cas où l’utilisateur a joué avec les ampoules entre temps
  • Permettre l’installation manuelle
  • Gestion des commandes

Updates :
[27/11/16] Ajout de la fonction ‘send’, qui permet d’appeler toutes les fonctions du module depuis les scripts (cf section ‘Usage’ du Readme). start_cf et set_music ne fonctionnent pas encore.

Voilà voilà, n’hésitez pas à me donner des conseils/avis et tout simplement à me dire si ça fonctionne ! :smiley:


#2

Si je peut te donner un avis.

  • Il faut toujours retourner une Promise aux méthodes public de ton module. (Méthodes qui peuvent être appelés par Gladys ou un utilisateur)
    Ta fonction exec ne retourne pas de Promise, elle retourne surrement null. Il te suffit de faire (je pense):
Yeelight.prototype.send = function(params) {
  parsed_params = JSON.stringify(params) + "\r\n";
    //console.log("Sending " + parsed_params.trim() + " to bulb " + this.data.id);
    this.socket.write(parsed_params);

   return Promise.resolve();
};

Yeelight.prototype.get_prop = function(params) {
    
    var command = {
        id: this.data.id,
        method: 'get_prop',
        params: params
    };
    
    return this.send(command);
    
};

#3

Merci pour le conseil, je vais corriger ça ce soir ! Juste une question, il y a une différence entre faire un simple return Promise.resolve(); dans la fonction et englober toute la fonction dans un return new Promise(function(resolve, reject) { … resolve(); }); ?


#4

Alors, le “return new Promise()” il faut éviter de l’utiliser, ça rend le script pas très lisible. Mais il est obligatoire quand tu as des fonctions async.

Exemple d’utilisation:
github.com/Time-Lords/gladys-sm … ib/send.js
La fonction request ne retourne pas de Promise, et fonctionne avec un callback. (async) C’était je pense, la seul solution possible.

Un exemple utile, il n’est pas obligatoire de retourner une Promise.resolve(); si tu as un flow de Promise.

function testMainPromise(){
  return Promise.resolve();
}

function testPromise(){
  return true;
}

function timeout(duration){
   return new Promise((resolve) => setTimeout(() => resolve(), duration));
}

var variable;

testMainPromise()
  .then(() => testPromise())
  .then(() => testMainPromise())
  .then(() => console.log('Waiting 3sec'))
  .then(() => timeout(3000))
  .then(() => variable='OK')
  .then((ok) => console.log(`All called ${variable}/${ok}`));

Je ne suis pas totalement expert des Promises, je ne connais pas non plus les meilleurs pratiques, donc si tu vois des erreurs @admin n’hésites pas ^^


#5

Bien joué pour le module !
Plus qu’à recevoir ces petites ampoules pour tester tout ça :smiley:


#6

Yes bien joué :slight_smile: Beau travail tout ça !


#7

J’ai fait quelques modifs pour cleaner le code, notamment des promises un peu partout.

Il en manque une importante au niveau du retour des ampoules (faire un reject si la commande a retourné une erreur), je ne sais pas trop où la mettre vu que ces retours sont gérés par un listener, j’ai du mal à comprendre comment gérer ce genre de situation. La fonction send() retourne une promise et déclenche du coup le on(“data”) du socket qui lui-même devrait retourner la promise selon le code de retour, je suis un peu perdu sur comment écrire ça.

Autre modif, la connexion/déconnexion au socket se fait à chaque commande envoyée au lieu de le faire à l’init de Gladys, ça évite les timeouts que j’avais avant et c’est probablement plus propre de pas avoir constamment X connexions ouvertes.

Accessoirement, on était plusieurs à avoir commandé des Yeelight, ça serait cool d’avoir un retour, histoire de savoir si au moins ça marche… :frowning:

EDIT - Bon en fait j’ai toujours des reboots intempestifs… Si quelqu’un a une solution, je suis preneur. L’erreur en question avant chaque reboot :
[color=#BF0000]0|gladys | Error: read ECONNRESET
0|gladys | at exports._errnoException (util.js:907:11)
0|gladys | at TCP.onread (net.js:557:26)[/color]


#8

Bonjour, le module n’est pas présent dans mon store, faut-il passer par l’installation manuelle via GitHub ?


#9

Je te déconseille de l’utiliser actuellement, il y a des problèmes importants et je n’ai pas beaucoup d’aide… Mais je suis sur une piste, j’updaterai le Git ce soir.


#10

Salut Coxyca, il n’y a pas de problème. Je vais fouiner un peu dedans pour voir si je peux aider !


#11

J’ai fait une grosse MAJ du module.
Ça ne marche pas mieux. Je pense abandonner le module et me tourner vers un autre système de domotique, j’en ai marre de galérer autant sans aide. Le plugin est bien évidemment open, si tu veux tenter de continuer n’hésite pas.

PS : il est à moitié utilisable, ça dépend de ta chance à l’instant T.


#12

Aie dommage :confused:

Je t’aiderais bien mais sans les ampoules c’est chaud de t’aider…


#13

Non mais ce qui est frustrant, c’est que le code pour les ampoules fonctionne, c’est ma compréhension du fonctionnement de Gladys qui ne va pas. Si j’exécute mes scripts hors Gladys, j’ai jamais aucun soucis de déco ou autre. Et même dans Gladys, aucun soucis si je passe uniquement via les deviceTypes. C’est dès que j’en contrôle plusieurs en même temps (via script ou scénario) que ça part en couilles et il suffit de reboot Gladys pour tout récupérer. Du coup j’en déduis qu’il doit y avoir une embrouille dans le flow des connexions/déconnexions aux sockets (erreur ECONRESET), mais je ne vois simplement pas comment régler ça…


#14

ah est-ce que ça serait pas uniquement un problème d’engorgement ? Je sais que pour les ampoules milights ils recommandent d’espacer les envois de commandes de 50ms au moins pour éviter de saturer et de faire sauter les connexions… Peut être qu’il faudrait faire de même ici ! Tu pourrais mettre en place un système de queueing qui enregistre en RAM la dernière heure à la milliseconde près de l’envoi d’une commande, si jamais ta requête arrive avant 50ms de la précédente, tu lance un setTimeout pour attendre un peu plus !


#15

Salut, j’ai un problème avec le module Yeelight, quand j’essaye d’utiliser les exemples il me dit qu’il ne trouve pas le module alors que ce module est bien installé (il a trouvé les ampoules par lui même) et il apparait bien, avec le bon nom, dans le dossier /api/hooks/.

Une idée d’où ça peut venir ?

0|gladys   | Error in script : ReferenceError: yeelight is not defined
^C
pi@gladys:~ $ ls gladys/api/hooks/
broadlink  forecast  network-scanner  pushbullet  rpi-info  telegram  voicerss  yeelight

#16

Salut

J’ai eu le même souci hier soir et j’ai trouvé cette solution :

https://github.com/NickDub/gladys-yeelight/pull/5


#17

@link39 et du coup tu as réussi a faire un script permettant de contrôler une ampoule ?


#18

Oui j’ai pu faire fonctionner les commandes on/off et le changement de couleurs basé sur rgb et hsv. Par contre je n’'ai pas réussi à gérer la température des couleurs (kelvin), mode CT d’après la doc.


#19

Attention, si vous lisez les commentaires de la PR, vous verrez qu’elle est foireuse. J’ai actuellement une version “develop” en cours de test…
Pour la tester, il faut l’installer à la main, via Git.


#20

@Pti_Nico Ah si c’est possible, je veux bien que tu partage le lien :wink: