Une première alpha de Gladys 3.0

Salut à tous!

J’ai sorti ce week end de Pâque une première alpha de Gladys :slight_smile: J’ai écris un petit tutoriel expliquant comment installer cette v3 sur un serveur avec Docker => http://gladysproject.com/fr/article/gladys-et-docker

Si vous voulez installer Gladys sur votre machine “manuellement” (sans Docker), pour développer, il vous suffit de cloner le repo :

git clone https://github.com/GladysProject/Gladys.git gladys && cd gladys

Ensuite de vous mettre sur la branche v3 :

git checkout v3

D’installer les dépendances :

npm install && npm install -g grunt-cli

( ou avec sudo suivant vos droits )

D’initialiser Gladys :

grunt buildProd && node init.js

Puis de lancer Gladys :

node app.js

Je suis conscient que ça peut être un peu long d’installer ça manuellement (c’est normal c’est pour dev ici). Sur Raspberry Pi je fournirais une build toute prête comme je disais !

N’hésitez pas à me donner vos retours !

Propre ! Beau boulot Pierre-Gilles

C’est du détail mais je passerai les tables en condensed ( table-condensed ).
Aussi l’engrenage en haut à droite du groupe d’onglet, il sert à rien. Peut être dans le breadcrumb plutot ?

Rien d’autre pour l’instant :wink:

Merci !

Pour les tables en condensed, tu trouves les lignes des tableaux trop épaisses ? J’ai peur que ça fasse trop fin condensed… Je vais tester :wink:

Pour l’engrenage inutile, j’ai pas encore mis d’actions, si il est inutile je le retirerais.

Ah oui, et je n’ai pas dis, petite surprise, fais Ctrl + espace sur n’importe quel écran de l’interface, tu verras une petite feature surprise :wink:

( Qui fonctionne, mais comme derrière ton Gladys n’est connecté à rien, ça ne fera pas grand chose… Regarde les logs et tu verras ce que ça donne ! )

Oui ! mais du coup il faut aussi passer en variable d’environnement à Gladys le nom de ta base.

La variable d’environnement s’appelle : MYSQL_DATABASE côté Gladys !

[quote=« admin »]
Pour les tables en condensed, tu trouves les lignes des tableaux trop épaisses ? J’ai peur que ça fasse trop fin condensed… Je vais tester ;)[/quote]

Oui un petit peu mais c’est du détail

Ok

[quote=« admin »]
Ah oui, et je n’ai pas dis, petite surprise, fais Ctrl + espace sur n’importe quel écran de l’interface, tu verras une petite feature surprise :wink:

( Qui fonctionne, mais comme derrière ton Gladys n’est connecté à rien, ça ne fera pas grand chose… Regarde les logs et tu verras ce que ça donne ! )[/quote]

Sending 500 ("Server Error") response:
 Error: No command detected

Edit: tu peux activer le BBCode :wink: ?

[quote]Sending 500 (“Server Error”) response:
Error: No command detected[/quote]

C’est bon signe ! Cela veut dire que pour la commande que tu avais tapée, le réseau de neurone de Gladys n’a détecté aucune commande :slight_smile: Par curiosité tu avais tapé quelle question ? Par contre, tu avais spécifié langue française ou anglaise lors de l’inscription ? pour l’instant seul le réseau de neurone français est véritablement performant ( je l’ai construire grâce aux phrases du questionnaire en ligne que j’avais fais tourner en français )

Si tu es bien en français, tape des commandes style “allume la lumière”, “éteins le salon”, enfin ce que tu veux, et regarde comment Gladys analyse ça dans les logs :wink: ( tu verras toujours des grosses erreurs vus que Gladys ne pourra rien faire ensuite, genre “service does not exist”, mais au moins tu pourras voir la commande détectée )

Le BBCode en dessous de ton message tu as une options : “Désactiver le BBCode” qui était cochée je crois… :wink:

Je lui ai demandé de tout et rien lol

  • Donne moi la météo de demain
  • Fait moi un café
  • Raconte moi une blague

:smiley:

Et alors dans les logs ? :smiley:

Je vais peut être mettre en ligne une petite expérience ou les gens pourraient parler à Gladys depuis le site Gladys, histoire de voir comment réagit le truc, et proposer aux gens d’enrichir le système en proposant leurs actions quand Gladys ne reconnait pas le texte. Voir carrément intégrer ça dans Gladys, ça pourrait être super sympa l’aspect “communautaire” ou tout le monde peut proposer des phrases depuis Gladys :slight_smile:

Juste une question pour ma culture personnelle

J’ajoute à la mano des infos en BDD ( Bah oui c’est "Work in progress… " :wink: ), et dans certaines tables il y’ a une colonne uuid.
A première vue chaque chaque uuid est différent mais rien n’empêche d’en avoir 2 identiques ( en tout cas côté mysql ).

Ça peut paraitre bête mais a quoi ça sert ? L’id n’est il pas suffisant ? ( oups 2 questions :smiley: )

Pour la première question, tu parles de quelle table en particulier ? :smiley: Parce que c’est pas normal, j’ai du oublié un “unique” quelques part !

En fait j’ai mis des uuids dans certaines tables quand ce sont des données qui sont communes à tous les utilisateurs/ ou qui a un moment seront utilisés entre plusieurs instances gladys.

Exemple 1 : table sentence

La table “sentence” regroupe une liste de phrases qui sont utilisées pour entrainer le réseau de neurone qui va classifier les questions de l’utilisateur. ( “Allume la lumière”, etc… ). Ces phrases sont sur un repo github et l’objectif est de mettre régulièrement à jour cette base de phrases afin de pouvoir améliorer Gladys au fil du temps sans forcément mettre à jour le software complet.

Imaginons du coup qu’une phrase avait une erreur ( du genre j’avais mal orthographié le service appelé ), et que je veuille mettre à jour sur toutes les gladys cette phrase, il me faut pouvoir identifier avec un id unique cette phrase. Or l’attribut “id” dans la table est propre à la db du user, et peut être différente dans chaque base ( car le user peut rajouter des phrases à lui potentiellement ). La seule solution est d’avoir un “uuid” unique qui permette d’identifier et de mettre à jour cette phrase :slight_smile:

Exemple 2 : table House

  • Pour la table House & Machine, la raison est différente. Imaginons que tu ai plusieurs instances de Gladys, une dans une maison et une autre dans ta maison de vacances. Imagine que tu veuille mettre en place un bus MQTT central où sont publié des events (genre “allume lumière 1” ). Les deux instances sont connectés au bus, cependant elles ne doivent attraper que les events liés à leur maison/machine, et du coup il faut une façon de pouvoir identifier de façon unique chaque maison/machine, et comme dans l’exemple précédent l’id n’est pas suffisant car juste unique dans la DB d’une machine.
    Le nom de la maison pourrait être l’élément différentiateur, mais bon je préfère générer un UUID qui identifiera de façon unique la maison.

C’est vrai que j’aurais pu du coup virer l’id simple qui est inutile dans ces tables, après d’après ce que j’ai lu les perfs sur les JOIN sont bien moins bonne quand la clé primaire est un UUID… Mieux vaut garder l’id integer en local à mon avis

edit: Je suis allé jeter un coup d’oeil, visiblement la table House et Machine n’avait effectivement pas la contrainte “unique”, j’ai corrigé ça :slight_smile:

Merci pour la réponse détaillée, j’ai pigé le truc et c’est tellement logique au final.

Ouai c’était ces deux tables là, la sentence est ok :wink:

Sinon tu remarqueras que certaines tables qui pourtant sont partagées avec tous les utilisateurs n’ont pas d’uuid ( je pense à eventType ). C’est parce que ces tables ont déjà un élément unique pour les différencier (ici l’attribut “code” qui est le code de l’évènement , genre “wake-up” ).

Je n’ai ajouté d’UUID que lorsque c’était nécessaire :slight_smile:

Tu as installé Node.js de quelle manière ?

Si tu ne l’as pas installé comme ça => github.com/GladysProject/Gladys … all.sh#L28 , réinstalle Node :slight_smile:

Pierre Gilles suite à notre discussion twitter, j’ai recloner le module

Même retour pour:

gladys.modules.hue.search() .then(function(bridges){});

et

[code]
gladys.modules.hue.register({ipaddress: ‘192.168.1.85’})
.then(function(){

})
.catch(function(err){
// you forgot to press the button…
// or bridge is not responding
});[/code]

Pour être sur de l’IP:

[code]~$ hue search
1 stations found

1: 192.168.1.85[/code]

aah je vois, my bad…

Il faut la toute dernière version de Gladys, et tout simplement… je l’avais pas poussé sur le github :stuck_out_tongue:

Je viens de pousser tout ça :slight_smile:

Mais bon, c’est totalement expérimental ^^

Aïe d’ailleurs ça a pété les builds travis… Je peux pas regarder ça maintenant, je verrais demain si j’ai le temps

@Florian

Si je dit pas de bêtises:

Les deux commandes font la même chose, mais ne l’installe pas au même endroit.
Second point, ces commandes install gladys v2, donc si tu veux la v3 “git checkout v3”

Les modules V2 ne sont pas compatibles V3

@admin

info: Successfully registered Philips Hue user

:wink:

@Florian:

Je plussoie VonOx, pour installer l’alpha de Gladys v3, il faut faire toute les commandes que j’avais mises dans le premier post de ce topic ( http://gladysproject.com/forum/viewtopic.php?f=13&t=6335#p11176 ), avec le git checkout v3 sinon tu installe Gladys v2.

Et non les modules ne sont pas compatible, il faudra faire quelques adaptations, je ferais un petit guide pour passer un module v2 à v3 quand j’aurais la définition exact d’un module v3. Le module philips hue est une sorte de POC pour moi pour voir comment ça se goupille avec le reste, mais ce n’est pas la version définitive d’un module v3 :slight_smile:

@VonOx : Ah bien !

Bon, du coup, tu peux créer en base deux trucs pour pouvoir tester un peu le truc =>

  • un Device : { name: ‘ce que tu veux’, protocol: ‘hue’, service: ‘hue’, room: ID_DE_CHAMBRE }
  • un DeviceType: {
    type: ‘binary’,
    tag: ‘le nom de la lampe qui sera utilisé dans les commandes vocales si tu veux la targeter directement’,
    identifier: 1 // l’identifier est un ID unique optionel fourni par le protocol utilisé qui permet de reconnaitre exactement la lampe, ici pour les Philips Hue ta lampe 1 a pour identifier 1, ta lampe 2 = 2, lampe 3 = 3. On aurait pu mettre cette info dans une table supplémentaire à la charge du développeur du module, mais ça aurait nécessité de faire une requête SQL supplémentaire côté module, et du coup on aurait eu une latence. Ici, on a une et une seule requête effectuée pour une commande, et du coup les perfs sont sympas. Pour monter encore plus haut en perf on peut faire un cache avec un petit Redis/ou juste côté Node.js pour accélérer encore en mettant en cache les deviceType les plus utilisés, là ça serait le must!
    sensor : 0 ( ta lampe n’est pas un capteur )
    device: l’id de ton device créé précédemment
    }

ça va faire apparaitre côté “device” dans l’interface le device, et tu pourras l’allumer ( pas l’éteindre, j’ai pas encore fait toutes les features :smiley: )

Et si tu avais selectionné langue française au début de l’installation, tu peux en faisant Ctrl + space sur n’importe quel page demander :

“Allume la lampe” ( si tu avais appelé ta lampe dans tag “lampe” ). Les fonctionnalités par zone ( allume le salon, etc… ) comme je montrais dans ma petite vidéo teasing ne sont pas encore dispos ! :wink:

PS : pour revenir sur le champs ‘identifier’ dans deviceType, je ne sais pas encore si je vais le laisser là, je vais peut être le mettre dans la table “device” car en général un même device a un seul identifier. Il faudrait que je vois dans toutes les autres technos avec lesquels on va bosser si c’est aussi le cas ( genre z-wave )

Sinon pour les device, normalement c’est les modules qui sont censés les ajouter ! ( genre typiquement le module Philips hue va scanner le réseau, trouver le bridge, et ajouter lui même les lampes détectée dans Gladys )

Dans l’interface le module aura un panneau de configuration qui permettra a l’utilisateur de re-lancer un scan si une lampe a été rajoutée depuis

Du coup j’ai tout ajouté mais il doit manqué un push :smiley:, j’ai cette erreur quand j’appuie sur ‘ON’

error: Sending 500 ("Server Error") response: Error: Incorrect value at /home/vonox/gladys/api/core/devicetype/deviceType.exec.js:20:39 at /home/vonox/gladys/node_modules/sails-mysql/lib/connections/spawn.js:120:16 at Object.module.exports.poolfully [as releaseConnection] (/home/vonox/gladys/node_modules/sails-mysql/lib/connections/release.js:28:12) at Query._callback (/home/vonox/gladys/node_modules/sails-mysql/lib/connections/spawn.js:105:35) at Query.Sequence.end (/home/vonox/gladys/node_modules/sails-mysql/node_modules/mysql/lib/protocol/sequences/Sequence.js:96:24) at Query._handleFinalResultPacket (/home/vonox/gladys/node_modules/sails-mysql/node_modules/mysql/lib/protocol/sequences/Query.js:144:8) at Query.EofPacket (/home/vonox/gladys/node_modules/sails-mysql/node_modules/mysql/lib/protocol/sequences/Query.js:128:8) at Protocol._parsePacket (/home/vonox/gladys/node_modules/sails-mysql/node_modules/mysql/lib/protocol/Protocol.js:280:23) at Parser.write (/home/vonox/gladys/node_modules/sails-mysql/node_modules/mysql/lib/protocol/Parser.js:73:12) at Protocol.write (/home/vonox/gladys/node_modules/sails-mysql/node_modules/mysql/lib/protocol/Protocol.js:39:16) at Socket.<anonymous> (/home/vonox/gladys/node_modules/sails-mysql/node_modules/mysql/lib/Connection.js:96:28) at emitOne (events.js:77:13) at Socket.emit (events.js:169:7) at readableAddChunk (_stream_readable.js:146:16) at Socket.Readable.push (_stream_readable.js:110:10) From previous event: at Object.set [as exec] (/home/vonox/gladys/api/core/devicetype/deviceType.exec.js:13:10) at Object.module.exports.exec (/home/vonox/gladys/api/controllers/DeviceTypeController.js:40:25) at wrapper (/home/vonox/gladys/node_modules/lodash/index.js:3095:19) at routeTargetFnWrapper (/home/vonox/gladys/node_modules/sails/lib/router/bind.js:176:5) at callbacks (/home/vonox/gladys/node_modules/express/lib/router/index.js:164:37) at param (/home/vonox/gladys/node_modules/express/lib/router/index.js:138:11) at param (/home/vonox/gladys/node_modules/express/lib/router/index.js:135:11) at pass (/home/vonox/gladys/node_modules/express/lib/router/index.js:145:5) at nextRoute (/home/vonox/gladys/node_modules/express/lib/router/index.js:100:7) at callbacks (/home/vonox/gladys/node_modules/express/lib/router/index.js:167:11) at module.exports (/home/vonox/gladys/api/policies/checkToken.js:25:12) at routeTargetFnWrapper (/home/vonox/gladys/node_modules/sails/lib/router/bind.js:176:5) at callbacks (/home/vonox/gladys/node_modules/express/lib/router/index.js:164:37) at param (/home/vonox/gladys/node_modules/express/lib/router/index.js:138:11) at param (/home/vonox/gladys/node_modules/express/lib/router/index.js:135:11) at pass (/home/vonox/gladys/node_modules/express/lib/router/index.js:145:5) at nextRoute (/home/vonox/gladys/node_modules/express/lib/router/index.js:100:7) at callbacks (/home/vonox/gladys/node_modules/express/lib/router/index.js:167:11) at module.exports (/home/vonox/gladys/node_modules/sails/lib/hooks/cors/clear-headers.js:14:3) at routeTargetFnWrapper (/home/vonox/gladys/node_modules/sails/lib/router/bind.js:176:5) at callbacks (/home/vonox/gladys/node_modules/express/lib/router/index.js:164:37) at param (/home/vonox/gladys/node_modules/express/lib/router/index.js:138:11) at pass (/home/vonox/gladys/node_modules/express/lib/router/index.js:145:5) at nextRoute (/home/vonox/gladys/node_modules/express/lib/router/index.js:100:7) at callbacks (/home/vonox/gladys/node_modules/express/lib/router/index.js:167:11) [Error: Incorrect value]

Arf, j’ai oublié de te dire qu’il fallait mettre min à 0 et max à 1 pour le device type binary :slight_smile: