
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 !



Laisser un commentaire