domotique

Dernière modification : 2013/09/25 16:31

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)