Librairie domotique: Interconnecter les modules

Afin de simplifier au maximum l’écriture des sketchs et donc la configuration du système, j’ai ajouté la possibilité de lier des modules émetteur (interrupteur, capteur) et récepteur (lumière, …) entre eux.

[adsGrandRectangleTexte]

Interconnexion

Un module doit définir une action à effectuer quand le module émetteur associé est activé, c’est le rôle de la méthode « Action ».

class Module
{
    [...]
    public:
        virtual void Action(void*) = 0;
};

Exemple de module : une lumière

class Light : public Module
{
    protected:
        Timer m_AutoOffTimer;     // Timer pour la fonction d'extinction automatique
        int m_iAutoOffTime;       // Temps avant l'extinction automatique

        Output m_output;          // La sortie associée
    public:
        Light();
        Light(uint8_t, uint8_t char*);  // Id carte, numero io, nom
        ~Light();

        void SetAutoOff(int);     // Positionne la consigne d'extinction automatique
        void Update();            // Mise à jour de l'io

        void Set(uint8_t);        // Modifie l'état de la sortie
        void Toogle();            // Bascule la sortie
        void Action(void*);       // Action à effectuer quand l'émetteur associé
                                  // est activé
        [...]
 };

Ci-dessous la méthode Action définit dans le module « Light ».

void Light::Action(void* _arg)
{
    ConfigModule* config = (ConfigModule*)_arg;

    switch(config->onOff)
    {
        case ONOFF:
            Toogle();
            break;
        case OFF:
            Set(LOW);
            break;
        case ON:
            Set(HIGH);
            break;
        default:
            break;
    }
}

ConfigModule est une structure contenant les détails de l’association entre le module émetteur et le module récepteur : l’action est elle lancée sur un clic, deux clic ? sur une pression longue ? sur un front montant/descendant ? L’émetteur peut il allumer et/ou éteindre le module ? … cette structure sera amené à évoluer mais répond pour l’instant à mais besoins.

Ici, si l’association est définie en ONOFF, une activation du module émetteur associé va faire basculer la lumière à l’état opposé. S’il est configuré en ON, le module émetteur ne pourra qu’allumer la lumière, idem pour OFF. Ceci permet par exemple de pouvoir allumer/éteindre la lumière du salon avec un interrupteur mais aussi de pouvoir éteindre le salon ET la salle à manger sur un appuis long.

L’exemple

Dans cet exemple, on commence par configurer un interrupteur ainsi que deux lumières.
Nous associons ensuite les lumières à l’interrupteur grâce à la méthode « LinkModule » qui prend en dernier paramètre l’action à réaliser sur le module (ONOFF, ON, OFF) et en paramètres 2 et 3 les conditions à satisfaire : nombre d’appuis courts nécessaires ou appuis long de n millisecondes.

Ici, un appuis court sur l’interrupteur allumera ou éteindra la lumière 1 (fonctionnement classique d’un interrupteur) et un appuis long de 2 secondes éteindra et la lumière 1 et la lumière 2.
On peut imaginer la gestion d’une troisième lumière via un double appuis court par exemple.

#include <ConnectingStuff.h>

Switch interSalon;
Light lumiereSalon;
Light lumiereSam;

void setup()
{
  // Définit l'ID unique de la carte sur le réseau
  ConnectingStuff::SetCARDID(1, "carte1");

  interSalon.Init(2, "Salon/Sam");
  lumiereSalon.Init(1, 12, "Salon);
  lumiereSam.Init(1, 13, "Sam");

  interSalon.LinkModule(&lumiereSalon, 1, 0, ONOFF);
  interSalon.LinkModule(&lumiereSalon, 0, 2000, OFF);
  interSalon.LinkModule(&lumiereSam, 0, 2000, OFF);
}

void loop()
{
    interSalon.Update();
}

J’espère ne pas avoir été trop confus, n’hésitez pas à poser des questions si c’est le cas ou à regarder les sources de la librairie.

Partagez moi ...Tweet about this on TwitterShare on Facebook0Share on Google+0Digg thisEmail this to someone

Vous aimerez aussi...

4 réponses

  1. luccio dit :

    bonjour,
    la lib etait-elle toujours maintenue ?
    j’ai commencé a l’utiliser, et fait qq tests.
    Mais le linkModule ne fonctionnait pas : le check de l’id de carte est fait dans l’init de Module alors que le setcardID n’est pas encore passé.

    tu maintiens la lib ailleurs que chez google ? ou bien elle est abandonnée ? si c’est le cas, c’est dommage, ca me paraissait vraiment pas mal comme soft !

    • Olivier dit :

      Salut,
      Étant en location depuis la vente de ma maison il y a deux ans, j’ai mis un peut le projet de coté. Mais j’emménage dans 15jours dans ma nouvelle maison et les projets domotique vont donc reprendre :). Je pense donc dépoussiérer et faire évoluer la lib dès que possible.

      Les sources passeront par la même occasion sur github.

  2. luccio dit :

    juste pour preciser: la signature de Light a changé entre l’exemple ci-dessus et les ex fournis sur le googlecode du projet.

Laisser un commentaire

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