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 !

La suite dans par ici

8 réflexions sur “SARAH gagne quelques Neurones (1/2)

  • 15 mai 2013 à 0 h 59 min
    Permalien

    [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]

    Répondre
  • 15 mai 2013 à 12 h 39 min
    Permalien

    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 -_-

    Répondre
  • 15 mai 2013 à 12 h 54 min
    Permalien

    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

    Répondre
    • 15 mai 2013 à 13 h 10 min
      Permalien

      A voir sur quel type de machine je peut virtualiser windows. Le PC h24 je suis pas fan (économie d’énergie tout ça ^^)

      Répondre
  • 15 mai 2013 à 13 h 13 min
    Permalien

    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 ^^

    Répondre
  • 17 mai 2013 à 15 h 03 min
    Permalien

    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…

    Répondre
  • 17 mai 2013 à 15 h 06 min
    Permalien

    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.

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.