domotique
Dernière modification : 2013/09/25 16:31
Accueil
Éditer (
Aide
) /
Historique
Idées concernant la domotique DIY pour utilisation perso '''BROUILLON''' !Modules Système avec modules communicants, peut-être à base de attiny et transceiver SI4432. Possibilité d'un module maître qui aura l'adresse 0x0000 (typiquement un petit serveur sous linux comme le raspberry pi) pour l'enregistrement des données et la tenue d'un journal Le modules communiquent entre eux par intermédiaire de messages. Ils ont tous une adresse en dur (unique) et un nom, stockés dans leur eeprom (modifiables). Un bouton sur les module permet la recherche adresse libre. Une fois trouvée, une led indique l'adresse par un système clignotement, et le module envoie pendant 10s un message broadcast "0x0001 Bonjour" avec ses infos. Un module peut avoir plusieurs fonctions (capteur température + relais, ...) Lorsqu'un module envoie un message (ordre) à un autre module qui demande une réponse, il envoie un code "clé de conversation" qui permettra de repérer la réponse. !Structure d'une trame ''à définir'' !!Trame La trame doit être cryptée un minimum (''comment? rolling code? '') !!Messages Les messages sont sous la forme {{EEEEDDDDMMMM[P...] DDDD Code du destinataire, ou 0XFFFF pour un broadcast EEEE Code de l'émetteur CCCC Clé de conversation. Permet le suivit des messages lorsqu'un module attend une réponse à un message envoyé. 0x0000 si non utilisé. MMMM Code message P Parametre(s), facultatif, longueur variable, sérialisé}} Le message peut être adressé à tous par broadcast, par exemple un capteur qui envoie la température toutes les minutes. Il peut-être adressé à un module particulier, mais il peut être aussi "auto-adressé" : par exemple, avec un module équipé d'un capteur d'hydrométrie et d'un relais. Le capteur déclenche un relais au delà d'un certain seuil. !!!Sérialisation des variables Les variables seront sérialisées de la façon suivante {{ TT=Type [LL]=Longueur pour les variables de taille non fixe (chaines) VV...=Valeurs }} Les différents types de variables possibles sont {{ 01XXXX entier sur 16bits 02XXXXXXXXX entier sur 32bits 03XXXXXXXXX flottants sur 32bits (selon IEEE ) 04NNC... chaines, ou NN représente le nombres de [C]aratères }} voir codage flottants sur http://fr.wikipedia.org/wiki/IEEE_754 !!!0x0001 Info Le module renvoie ses caractéristiques Parametres : {{ int16 : cle de conversation (ou 0x000 si broadcast) int16 : adresse du module char : nom du module int16 : fonction 1 du module int16 : fonction 2 du module ... }} Exemples : {{0001 01 0000 01 0012 04 09 4368616d6272654d31 01 0001 Il s'agit d'un simple relais 0001 Info 01 0000 Pas de clé, c'est un broadcast émi par l'appui sur le bouton physique se trouvant sur le module. 01 0012 Module à l'adresse hexa 0x0012 04 09 4368616d6272654d31 Nom du module ChambreM1 01 0001 Fonction du module 0x0001 (relais)}} {{0001 01 1234 01 0024 04 09 4368616d6272654d31 01 0001 01 0001 01 0004 Il s'agit d'un double relais, avec capteur de température/humidité 0001 Info 01 1234 Clé de conversation, ici 1234 qui a été passée par le module demandeur 01 0024 Module à l'adresse hexa 0x0024 04 09 4368616d6272654d31 Nom du module ChambreM1 01 0001 Fonction 1 du module 0x0001 (relais) 01 0001 Fonction 2 du module 0x0001 (relais) 01 0004 Fonction 3 du module 0x0004 (capteur de température et humidité)}} !!!0x0002 État d'une fonction d'un module Réponse à un message 0x0102. La réponse dépend du type de fonction: {{ int16 : clé de conversation var : état : par exemple pour un relais cela peut être ouvert ou fermé voir 0x201), pour un capteur de température/hygrométrie les °C et % d'humidité, pour une horloge ce sera la date et l'heure... }} !!!0x0101 Demande d'info à module Demande à un module d'envoyer le message 0x0001 Info Parametres : {{ int16 : clé de conversation }} !!!0x0102 Demande l'état actuel Parametres : {{ int16 : clé de conversation int16 : numéro de fonction du module cible }} le module cible retournera un message 0x0002 Exemples : {{0101 01 1234}} !!!0x0201 Demande de commutation d'un relais ou d'un variateur N'est destiné qu'aux modules ayant une fonction relais ou variateur Parametres : {{ int16 : cle de conversation int16 : numéro de fonction du module cible (souvent numéro de relais, voir 2ème exemple "0x0001 bonjour" int16 : de 0x0000=ouvrir (éteindre) à 0x00FF=fermer (allumer). Pour les relais si > 0x0000 = fermer. Si 0xFFFF, inverser l'état actuel (allumé au niveau 0xXX / éteint). int16 : si > 0x0000, maintenir le nouvel état pendant xx secondes, aller à l'état inverse. }} !!!0x0301 Compte rendu d'exécution Envoi un message au demandeur d'une tâche pour indiquer si elle s'est bien déroulée Paramètres : {{ int16 : clé de conversation int16 : état 0x0000 : Tout est OK 0x0001 : L'adresse n'est pas libre 0x0002 : Impossible de trouver une adresse libre 0x0010 : Nouveau nom vide 0x1000 : Le module ne possède pas la fonction demandée 0xFFFF : Autre erreur }} !!!0x0401 Change l'adresse d'un module Envoi un changement d'adresse à un module Paramètres : {{ int16 : clé de conversation int16 : nouvelle adresse, si 0x0000 : Le module doit chercher une adresse libre tout seul }} Le module cible répond ensuite par un message "0x0001 Bonjour" au demandeur avec sa nouvelle adresse, ou par un message 0x301 avec une erreur 0x0001 ou 0x0002 !!!0x0402 Change le nom d'un module Envoi un changement de nom à un module Paramètres : {{ int16 : clé de conversation char : nouvelle nom : Le module doit chercher une adresse libre tout seul }} Le module cible répond ensuite par un message "0x0001 Bonjour" au demandeur avec son nouveau nom, ou par un message 0x301 avec une erreur 0x0010 ! Types de modules Je vais définir ces modules sous forme de "pseudo classes", c'est plus facile pour mon esprit :-) !!!0x0403 Affectation d'une action à un bouton Affecte un action à un module contenant une fonction bouton Paramètres : {{ int16 : clé de conversation int16 : numéro de fonction bouton concernée int16 : module cible de l'action int16 : fonction concernée dans module cible de l'action int16 : type d'action souhaitée 0x0001 : fonction bascule pour relais/variateur : envoie un message inverser l'état à la cible 0x0002 : force l'allumage pour relais/variateur 0x0002 : force l'extinction pour relais/variateur int16 : durée de l'action (ou 0x0000 pour pas de durée définie). La durée est gérée par la cible de l'action }} Exemple : {{01 1234 01 0002 01 0013 01 0001 01 0002 01 00B4 Demande l'allumage du relais associé à la fonction 1 du module 0x13, pendant 3 mn quand on appuis sur le bouton associé à la fonction 2. 01 1234 : Clé de conversation 01 0002 : Fonction associé au bouton (correspond sûrement au bouton 2) 01 0013 : module cible de l'action visée 01 0001 : fonction du module cible associée au relais 01 0002 : action=allumage 01 00B4 : 180s, soit 3 minutes }} ! Types de modules Je vais définir ces modules sous forme de "pseudo classes", c'est plus facile pour mon esprit :-) !! Module de base {{Class Module(Objet): Materiel: uControleur UC; # attiny ? transceiver TR; # SI4432 ? Prive: Attributs : # Adresse sur le réseau. Par défaut 0xFFFF=pas initialisé uint Adresse=0xFFFF; # Type_module = type du module (relai, bouton, capteur...) uint Type_module=0x0000; Methodes : # Ecoute le réseau pour detecter un message nous concernant (ou broadcast) void ecoute(void); # Cherche une adresse libre sur le réseau uint cherche_adresse_libre(void); # Envoi d'un message sur le réseau bool envoi_msg(destinataire, variables); # Envoi une quittance bool quittance(CLE, variable); Public: # No de fonction nom / paramètres 0x01 bonjour # Envoie l'adresse du module en broadcast sur le réseau # Sert lorsque le module a été initialisée manuellement, dans ce cas le message bonjour est envoyé toutes les secondes pendant 10s. 0x03 get_type / CLE, demandeur # envoie le type de module au demandeur, avec sa CLE 0xFF set_adresse / CLE, demandeur, adresse # Fixe l'adresse du module # retourne une quittance à l'émetteur 0x00=OK, 0x01 adresse pas dispo, 0xFF autre erreur }} !!Module relais Simple relais {{Class Relais(Module): Materiel: relais RELAIS Prive: bool Etat_par_defaut=False; # Etat du relai à la mise sous tension. False=Ouvert, True=Fermé bool Etat=False; # Etat actuel du relai Public: 0x10 get_etat / CLE, demandeur # envoie l'état du relais au demandeur, avec sa CLE 0x11 set_etat / CLE, demandeur, delai=0 # fixe l'état du relais. Si delais>0, l'état est maintenu pendant 'delai' secondes, puis rebascule à l'état inverse # retourne une quittance à l'émetteur 0x00=OK, 0xFF erreur 0x11 bascule_etat / CLE, demandeur # bascule l'état du relais de ouvert à fermé et inversément # retourne une quittance à l'émetteur 0x00=OK, 0xFF erreur 0x20 get_etat_defaut / CLE, demandeur # envoie l'état du relais au demandeur, avec sa CLE 0x21 set_etat_defaut / CLE, demandeur, etat # fixe l'état par défaut du relais # retourne une quittance à l'émetteur 0x00=OK, 0xFF erreur }} !!Module Poussoir Bouton poussoir, contact temporaire {{Class Poussoir(Module): Materiel: bouton BTN Prive: int cible int fonction var variable Public: 0x10 set_action / CLE, demandeur, cible, fonction, variable # Fixe l'action à accomplir quand on appuie sur le bouton # cible=adresse du module cible # numéro de la fonction publique à appeler lors de l'appui # variable à passer à la fonction }} !!Module Inverseur Interrupteur ON/OFF {{Class Inverseur(Module): Materiel: bouton BTN Prive: int cible int fonction_on var variable_on int fonction_off var variable_off Public: 0x10 set_action / CLE, demandeur, cible, fonction_on, variable_on, fonction_off, variable_off # Fixe les actions à accomplir (voir poussoir) }} TOC
Mot de passe :
Wiki utilisant
WiKiss 0.3
contact :
francois@ ce nom de domaine
2025/05/09 09:55 -- 18.117.176.186
Éditer (
Aide
) /
Historique