Idées concernant la domotique DIY pour utilisation perso BROUILLON
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.
à définir La trame doit être cryptée un minimum (comment? rolling code? )
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.
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
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é)
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...
Demande à un module d'envoyer le message 0x0001 Info Parametres :
int16 : clé de conversation
Parametres :
int16 : clé de conversation
int16 : numéro de fonction du module cible
le module cible retournera un message 0x0002
Exemples :
0101 01 1234
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.
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
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 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
Je vais définir ces modules sous forme de "pseudo classes", c'est plus facile pour mon esprit :-) 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
Je vais définir ces modules sous forme de "pseudo classes", c'est plus facile pour mon esprit :-)
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
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
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
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)
|