SARAH gagne quelques Neurones (1/2)
Cela fait des années que je réfléchis à une manière de jouer avec des Réseaux de Neurones dans un cas concret.
Cet article présente une problématique domotique « ultra simple » que l’on peut résoudre avec un peu d’IA 😉
Contexte
J’utilise toujours une box domotique Eedomus pour piloter des composants:
- 2 Interrupteurs de lampe
- 1 Détecteur de mouvement
- et qui fait aussi Détecteur de luminosité (et température)
Plugins
Côté SARAH j’ai 2 plugins:
- Un plugin
scénario
- Qui parle: Bonjour / Au revoir
- Qui allume/éteint les lampes
- Un plugin
détecteur
- Mouvement: Scénario 1 allume
- Plus de mouvement: Scénario 0 éteint
Cas d’usage
Agenda
J’ai programmé, matin et soir, l’allumage et l’extinction des lampes via des événements récursifs Google Calendar et le plugin calendar de SARAH.
Speech to Text
Par moment, il nous arrive de demander explicitement à SARAH d’allumer les lampes quand il fait très sombre.
Browser / QRCode
La nuit, quand je me couche tard, je demande explicitement à SARAH d’éteindre les lampes. Ca évite de réveiller tout le monde. Oui honte sur moi j’ai eu la flemme d’imprimer un QRCode 😉
Mouvement
Quand je rentre dans la pièce la lumière s’allume. Et quand je quitte la pièce la lumière s’éteint. La box Eedomus envoie une requête automatiquement à SARAH.
Problème
Lors de la détection de mouvement la lumière s’allume parfois en pleine journée. Ce qui n’a pas de sens et dépend fortement de la luminosité, de mon humeur et des faces de la lune.
Je pourrais faire un test si luminosité > X
alors ne pas allumer les lampes. Mais suivant la pièce, l’heure de la journée, il faudrait trouver le bon X
.
Solution
L’idée est donc d’apprendre à SARAH via un Réseau de Neurones quand allumer ou éteindre la lampe en fonction de la luminosité.
Pour se faire j’utilise Brain.js qui simplifie tout le travail. J’avais aussi sous le coude depuis des années EncogJS.
[crayon]
var brain = require(‘./lib/brain’);
exports.action = function(data, callback, config, SARAH){
// Ici j’apprends des luminosité et le résultat attendu
var net = new brain.NeuralNetwork();
net.train([{input: [87/100], output: [1]},
{input: [68/100], output: [1]},
{input: [56/100], output: [1]},
{input: [36/100], output: [0]},
{input: [21/100], output: [0]}
])
// Ici j’affiche la luminosité, le résultat attendu, le résultat réel
console.log(12, 0, Math.round(net.run([12/100])));
console.log(25, 0, Math.round(net.run([25/100])));
console.log(48, 0, Math.round(net.run([48/100])));
console.log(60, 1, Math.round(net.run([60/100])));
console.log(72, 1, Math.round(net.run([72/100])));
console.log(95, 1, Math.round(net.run([95/100])));
console.log(21, 0, Math.round(net.run([21/100])));
var output = ‘OK’;
callback({‘tts’ : output});
}
[/crayon]
Après quelques tests « théoriques » ça marche assez bien 🙂
En pratique
1. Quand j’appelle explicitement le plugin scénario
, il faut:
- Récupérer la luminosité
- Apprendre à SARAH:
net.train( ... )
2. Quand le plugin détecteur
ou même scénario
est appelé implicitement, il faut:
- Récupérer la luminosité
- Interroger SARAH:
Math.round(net.run([...]))
- Petit TTS: « J’ai décidé de ne pas allumer les lampes »
Si SARAH se plante, il suffit d’explicitement d’éteindre ou allumer les lampes pour lui apprendre. Ce qui est assez élégant fonctionnellement c’est qu’il ne devrait plus y avoir d’explicite si le brain atteint un état stable.
Et le tout se persiste en JSON !
Conclusion
Il ne reste plus qu’à coder ! Je mettrai en ligne le code quand il sera prêt.
Mais vous avez compris le principe ! Sachez qu’il est possible de faire apprendre plusieurs critères simultanés (cf. la doc).
A vos plugins !
[TROLL]
Vous faites la même chose avec un presse bouton et un capteur de température, vous appelez ce plugin « Nest » et vous le vendez 300€ 😉
[/TROLL]
Excellent !
Il va vraiment falloir que je me mette à SARAH (plutôt que de juste suivre l’actu XD). Mais le fait de devoir un PC sous windows allumé en permanence me bloque encore pas mal -_-
Hé hé faut demander aux linuxiens de recoder les API Microsoft 😉 Sphynx c’est pas top ^^.
Sur la communauté plusieurs personnes font des machines virtuelles
A voir sur quel type de machine je peut virtualiser windows. Le PC h24 je suis pas fan (économie d’énergie tout ça ^^)
Ah bah, je rêve que la XBox 720 soit une platforme de dev pour mettre SARAH sur une machine opti. Mais je rêve ^^
Je trouve l’idée excellente par contre je vois un petit problème d’apprentissage. Imaginons que la lampe s’allume alors qu’elle ne devrait pas. Tu l’éteins alors à la main, mais entre temps la valeur de ton capteur de luminosité va changer donc le nouvel apprentissage ne va pas être fait avec les mêmes conditions que celles qu’il y avait au moment où il y a eu une erreur et j’ai l’impression qu’il va continuer à se tromper…
Très très bonne remarque ca fait partie des trucs à expérimenter. Tout comme le soir pour me coucher je veux explicitement éteindre indépendamment de la luminosité. C’est pour ça que je vais intégrer le temps en entrée du réseau.