J’ai sorti ce week end de Pâque une première alpha de Gladys 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 !
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 ?
[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
( 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
[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 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 ( 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…
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
J’ajoute à la mano des infos en BDD ( Bah oui c’est "Work in progress… " ), 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 )
Pour la première question, tu parles de quelle table en particulier ? 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
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
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
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”
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
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 )
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 !
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 , 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]