La Domotique & .Net bonne combinaison

ImageCalendarCreation   Create from : 3/27/2012 Calendar   Update from : 3/27/2012 ImageOwner   By : Proteus ImageVisites   Seen : 1632 CommentaireCount   Comment(s) : 3

Il y a maintenant plusieurs semaines j’ai présenté lors de l'édition 2012 des TechDays, un code qui vous permettez de contrôler des appareils électrique grâce à différents produits X10 et un peu de C#. Vous êtes nombreux à m’avoir sollicité pour d’autres produits et/ou d’autres modes de contrôle. Aussi je fais cet article afin de recueillir vos différents besoins afin que nous puissions les analyser ensemble.

Avec quels produits dois-je démarrer ?


Comme je l’avais mentionné dans un précédent billet. Des fournisseurs de produits X10 il en existe une quantité impressionnante sur le web, pour ma part je passe l’ensemble de mes commandes via « Maison du numérique » les prix sont très correcte et surtout le délaie de livraison est à toute épreuve. Pour commencer vous devez obligatoirement avoir un CM15Pro.

Il représente le gros de votre investissement, c’est lui qui, connecté à votre pc, va faire l’interface entre votre appareil électrique et votre ordinateur. Ensuite pour effectuer des tests avant de vraiment craquer la carte bleue, je vous conseil de commencer petit, prenez juste un AM12 pour contrôler la lumière. Une fois que vous aurez compris les bases, vous pourrez vous lâchez sur des produits plus exotique.

J’ai reçu mon matériel et maintenant quoi ?


Suivez ce Lien et procurez vous le SDK de ActiveHome. Une fois que vous l’avez, compilez le et mettez de coter le ficher fraichement reçu.

L’adresse

Commencez par identifiez l’adresse électrique de votre AM12 c’est cette adresse qui vous permettra d’allumer ou d’éteindre l’équipement. Pour notre exemple nous partirons du principe qu’il s’agit de l’adresse « C3 » (C représente la salle, 3 représente le numéro de l’appareil).

Les ordres

Les ordres qui nous intéressent sont contenu dans l'enum du coup nous allons developper une classe qui va nous permettre d’envoyer ces ordres. Il n’y a rien de plus à faire qu'instancier la classe et utiliser la méthode qui va prendre en paramètre, le code de l’appareil et l’ordre à envoyer. Notre méthode se chargera de transférer ces informations à l’exécutable que nous avons mis de coté.

L'enum Order

using System.Runtime.Serialization;

namespace Proteus.Services.HouseController.Contracts
{
    [DataContract(Name = "Order")]
    public enum OrderEnum
    {
        [EnumMember]
        None,

        [EnumMember]
        On,

        [EnumMember]
        Off,

        [EnumMember]
        DimmUp,

        [EnumMember]
        DimmDown,
    }
}

L'enum HouseCode

using System.Runtime.Serialization;

namespace Proteus.Services.HouseController.Contracts
{
    [DataContract(Name = "HouseCode")]
    public enum HouseCodeEnum
    {
        [EnumMember]
        None,

        [EnumMember]
        A,

        [EnumMember]
        B,

        [EnumMember]
        C,

        [EnumMember]
        D,

        [EnumMember]
        E,

        [EnumMember]
        F,

        [EnumMember]
        G,

        [EnumMember]
        H,
    }
}

La classe X10Manager

using System.Diagnostics;
using Proteus.Services.HouseController.Contracts;
using Proteus.Services.HouseController.Interfaces;

namespace Proteus.Services.HouseController.Implementations
{
    public class X10Manager : IX10Manager
    {
        #region Variables
        private string _executableFullNamePath = @"C:\Program Files (x86)\AHSDK\bin\ahcmd.exe";

        #endregion

        #region Constructeurs
        public X10Manager() { }

        #endregion

        #region Methodes
        #region Public
        public void SetExecutableFullPathName(string value)
        {
            if (System.IO.File.Exists(value))
                _executableFullNamePath = value;
        }
        public void SendOrder(HouseCodeEnum houseCode, int portCode, OrderEnum order)
        {
            string parameterArgs = string.Format("sendplc {0}{1} {2}", houseCode, portCode, order);
            ProcessStartInfo processStartInfo = new ProcessStartInfo(_executableFullNamePath, parameterArgs);
            processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            System.Diagnostics.Process.Start(processStartInfo);
        }

        #endregion

        #endregion
    }
}

Il ne vous reste plus qu'a créer deux methodes qui vont se charger de consommer ce code.

public void PowerOn()
{
    X10Manager manager = new X10Manager();
    manager.SendOrder(HouseCodeEnum.C, 3, OrderEnum.On);
}
public void PowerOff()
{
    X10Manager manager = new X10Manager();
    manager.SendOrder(HouseCodeEnum.C, 3, OrderEnum.Off);
}

Dès lors, vous devriez déjà avoir une première mouture qui fonctionne. Prochaine étape, un peu d’exotisme dans le passage d’ordre.

J’aimerai bien faire un truc plus futuriste


Lors des TechDays, j’avais montré comment l’action d’appuyer sur la tête de Nao pouvait declencher l'allumage de la lumière que j’avais achetée la veille. Nous n’avons pas tous des « Nao » sous la main. Alors nous allons commencer par allumer la lumière en commande vocale.

using System;
using System.Collections.Generic;
using System.Speech.Recognition;
using System.Windows;
using Proteus.Services.HouseController.Contracts;
using Proteus.Services.HouseController.Implementations;

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        #region Variables
        private SpeechRecognizer _speechReco;
        private List _grammerList;
        private Boolean _grammarListCharged = false;

        #endregion

        #region Constructeurs
        public MainWindow()
        {
            InitializeComponent();
            _grammerList = new List();
            ChargeDatas();
            ConnectSpeechReco();
        }

        #endregion

        #region Methodes
        private void ChargeDatas()
        {
            _grammerList.Add("Allume la lumière du salon");
            _grammarListCharged = true;
        }
        private Grammar CreateGrammarObject()
        {
            Choices choices = new Choices(_grammerList.ToArray());
            GrammarBuilder builder = new GrammarBuilder(choices);
            Grammar gram = new Grammar(builder);
            return gram;
        }
        public void ConnectSpeechReco()
        {
            if (_grammarListCharged && _speechReco == null)
            {
                _speechReco = new SpeechRecognizer();
                _speechReco.SpeechRecognized += new EventHandler(EventSpeechRecognized);
                _speechReco.LoadGrammar(CreateGrammarObject());
                _speechReco.Enabled = true;
            }
        }
        public void DisconnectSpeechReco()
        {
            if (_speechReco != null)
            {
                _speechReco.Enabled = false;
                _speechReco.SpeechRecognized -= new EventHandler(EventSpeechRecognized);
                _speechReco.Dispose();
                _speechReco = null;
            }
        }
        private void EventSpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            if (e.Result.Text == "Allume la lumière du salon")
            {
                X10Manager manager = new X10Manager();
                manager.SendOrder(HouseCodeEnum.C, 3, OrderEnum.On);
            }
        }

        #endregion
    }
}

N'hesitez pas a prendre ce code, copier le dans un nouveau projet WPF. Vous devriez pouvoir faire rapidement un test.

Conclusion


Les idées sont nombreuses et sans vraiment de limite, vous pouvez très bien imaginer pouvoir contrôler vos volets électrique grâce à Kinect (évitez juste de vous prendre pour « Dark Vador »), etc. Si jamais vous avez des idées mais pour lesquels vous ne voyez pas de solutions technique laissez un commentaire j’essaierai de le reprendre avec vous pour vous aider.

Edit Message Delete Message ContactMe   Contact Me

Comment from Geek attitude




Sacré projet, je suis vraiment bluffé. Bonnes continuations !

Create from : 5/3/2012

Comment from bentou_n




Peut-on avoir le code source des techdays sur la session domotique.

Merci

Create from : 5/25/2012

Comment from Proteus




Bonjour, une mise a jour de cet article est presente dans le magazine Programmez de cet été. Vous pouvez trouver le code source lié a cet article sur le topic suivant : Maison Connectée. N'hesitez pas a me dire si il manque quelque chose.

Create from : 7/8/2012


Leave Comment