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.
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 !
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.
juste pour preciser: la signature de Light a changé entre l’exemple ci-dessus et les ex fournis sur le googlecode du projet.
Ok, merci je mettrai tout ça à jour.