bonjour
premier message sur le fofo.
ce topic est impressionnant. je le suis depuis longtemps, mais je me suis décidé à le mettre en oeuvre que récement.
j'ai acheté un RFlink tout fait, en 334.42Mhz, chez nodo, parce qu'en travaux, j'ai eue la flemme de prendre le risque de perdre des morceau et pas gérer la soudure.
quel n'a pas été ma déception que ca ne marche pas. je suis allé sur le git de Christophe HD, j'ai DL les deux fichier qui pourtant sont a priori dédié au nodo, et patatra;
me voila donc a parcourir les derniers topic que j'avais loupé.
j'ai découvert le correctif, j'ai un peu "luté" pour le mettre en oeuvre.
pour que je contribue, voila les deux notes pour la postérité :
d'abord, le fichier =>
Code : Tout sélectionner
#define TRANSCEIVER_RX_PIN 19 // Set the pin that receives data from your 433.42 Mhz Receiver
#define TRANSCEIVER_MODE_PIN 15 // Aurel transceivers have a pin that let the hardware switch to RX and TX mode
#define TRANSCEIVER_ENABLE_PIN 22 // Aurel transceivers have a pin that must be set to HIGH to enable the transmitter
// DO NOT CHANGE THESE SETTINGS BELOW
#define TRANSCEIVER_TX HIGH
#define TRANSCEIVER_RX LOW
volatile long duration = 0;
volatile long prev_time = 0;
volatile boolean data_dispo = false;
byte input = TRANSCEIVER_RX_PIN;
String trame[3];
byte message = 0;
byte start = true;
byte intro = 0;
String prefixe = "1100";
void setup() {
Serial.begin(115200);
// set the Aurel transceiver to RX mode
pinMode(TRANSCEIVER_MODE_PIN, OUTPUT);
digitalWrite(TRANSCEIVER_MODE_PIN, TRANSCEIVER_RX);
// enable Aurel transmitter
pinMode(TRANSCEIVER_ENABLE_PIN, OUTPUT);
digitalWrite(TRANSCEIVER_ENABLE_PIN, HIGH);
delay(500);
// assign an interrupt on pin x on state change
pinMode(TRANSCEIVER_RX_PIN, INPUT);
attachInterrupt(digitalPinToInterrupt(input), declenche, CHANGE);
pinMode (LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
Serial.print("Hello world");
}
void loop() {
if (data_dispo == true) {
int bit_state = digitalRead(input);
if ((duration > 700) && (duration < 950)) { // pulse off court
trame[message] = trame[message] + !bit_state;
} else if ((duration > 1400) && (duration < 1950)) { // pulse off long
// verifie qu'on commence avec un pulse long à 1
if ((start == true) && (!bit_state == HIGH)) {
trame[message] = trame[message] + !bit_state + !bit_state;
start = false;
} else if (start == false) {
trame[message] = trame[message] + !bit_state + !bit_state;
}
} else {
start = true; // debut d'une nouvelle trame
if (trame[message].length() > 200) {
message++;
if (message > 2) {
for (message = 0; message < 3; message++) {
for (int x = 0; x <= 50; x=x+4) {
if (trame[message].substring(x,x+4).compareTo(prefixe) == 0) {
intro++;
} else {
break;
}
}
if (intro > 6 ) {
digitalWrite(LED_BUILTIN, HIGH);
// décodage des bits de la trame: 00=0, 11=0, 10=1, 01=1
String sortie = "";
for (int x = (intro*4); x <= trame[message].length(); x=x+2) {
if ((trame[message].substring(x,x+2) == "00") or (trame[message].substring(x,x+2) == "11")) {
sortie = sortie + "0";
} else {
sortie = sortie + "1";
}
}
String sortie_without_bitstuff = remove_bitstuff(sortie);
sortie = sortie_without_bitstuff;
String sortie_hex = convert_binary_string_to_hex_string(sortie);
Serial.print("Trame reçue :");
Serial.println(sortie_hex);
// repartition en bytes
byte id1 = convert(sortie.substring(0,8)); // byte 3
byte id2 = convert(sortie.substring(8,16)); // byte 4
byte id3 = convert(sortie.substring(16,24)); // byte 5
byte num = convert(sortie.substring(48,56)); // byte 9 (repeat)
byte prechauff = convert(sortie.substring(56,64)); // byte 10 (pre-heated) 0=Reduit, 3=Confort, 4=Hors gel
byte chauffage = convert(sortie.substring(64,72)); // Heating
byte battery = convert(sortie.substring(72,80)); // Battery
Serial.print("Message #");
Serial.println(num);
Serial.print("ID: ");
Serial.print(id1, HEX);
Serial.print("-");
Serial.print(id2, HEX);
Serial.print("-");
Serial.println(id3, HEX);
Serial.print("Mode : ");
prechauff &= 0x0F;
switch (prechauff) {
case 0:
Serial.println("Réduit");
break;
case 3:
Serial.println("Confort");
break;
case 4:
Serial.println("Hors gel");
break;
default:
Serial.print("Inconnu (");
Serial.print(prechauff);
Serial.println(")");
}
Serial.print("Température eau : ");
Serial.println(chauffage);
Serial.print("Batterie : ");
if (battery > 0)
Serial.println("LOW");
else
Serial.println("OK");
if (num > 1)
Serial.println("##########");
else
Serial.println("----------");
intro = 0;
digitalWrite(LED_BUILTIN, LOW);
}
}
trame[0] = "";
trame[1] = "";
trame[2] = "";
message = 0;
}
} else {
// Re-initialise la trame s'il n'y avait pas de données juste avant
if ((message == 0) || (trame[message-1].length() < 200)) {
trame[0] = "";
trame[1] = "";
trame[2] = "";
message = 0;
}
}
}
data_dispo = false;
}
}
void declenche() {
duration = micros()-prev_time;
prev_time = micros();
data_dispo = true;
}
byte convert(String entree) {
byte result = 0;
for (int f = 0; f <= 7 ; f++) {
if (entree.substring(f,f+1) == "1") bitSet(result, f);
}
return result;
}
String convert_binary_string_to_hex_string(String data) {
String sortie = "";
for (int x = 0; x < (data.length()/8);x++) {
byte hex = 0;
for (int f = 0; f <= 7 ; f++) {
if (data.substring((x*8)+f,(x*8)+f+1) == "1")
bitSet(hex, f);
}
if (hex <= 0x0F)
sortie += "0";
sortie += String(hex, HEX);
}
sortie.toUpperCase();
return sortie;
}
String remove_bitstuff(String data) {
// The protocol uses bit-stuffing => remove 0 bit after five consecutive 1 bits
// Also, each byte is represented with least significant bit first -> swap them!
String sortie = "";
int ones = 0;
for (uint16_t k = 0; k < data.length(); k++) {
if (data[k] == '1') {
sortie += "1";
ones++;
} else {
if (ones != 5) // Ignore a 0 bit after five consecutive 1 bits:
sortie += "0";
ones = 0;
}
}
return sortie;
}
comme le stipule l'aide, ouvrez ensuite un terminal com.
vous devriez voir un "hello word" qui s'affiche. si ce n'est pas le cas et / ou qu'il apparait avec une forme zarb, pas de panique !
le fait est aussi que la vitesse a changé. en bauds, vous devrez mettre : 115200 <- ca, c'est la seconde information ^^
mettez le thermostat en "jour", puis changez la température, puis remettez vous en auto.
puis ATTENDEZ QUELQUES SECONDES.
et la, BINGO, ca marche.
ensuite, on attaque le transeiver; ici, je peu fournir deja quelques indications, mais comme je n'ai pas réussi a faire marcher le tout, peut etre que ces indications ne sont pas les bonnes, alors soyez prudents.
https://github.com/ChristopheHD/frisque ... ceiver.ino
les broches 19,15,22 me laissent penser que ca été corrigé ?
puisque le début :
Code : Tout sélectionner
#define TRANSCEIVER_RX_PIN 19 // Set the pin that receives data from your 433.42 Mhz Receiver
#define TRANSCEIVER_MODE_PIN 15 // Aurel transceivers have a pin that let the hardware switch to RX and TX mode
#define TRANSCEIVER_ENABLE_PIN 22 // Aurel transceivers have a pin that must be set to HIGH to enable the transmitter
#define TRANSCEIVER_TX HIGH
#define TRANSCEIVER_RX LOW
ressemble comme deux goutte d'eau a la version modifié du fichier de reception corrigé que j'ai partagé plus haut :
Code : Tout sélectionner
#define TRANSCEIVER_RX_PIN 19 // Set the pin that receives data from your 433.42 Mhz Receiver
#define TRANSCEIVER_MODE_PIN 15 // Aurel transceivers have a pin that let the hardware switch to RX and TX mode
#define TRANSCEIVER_ENABLE_PIN 22 // Aurel transceivers have a pin that must be set to HIGH to enable the transmitter
// DO NOT CHANGE THESE SETTINGS BELOW
#define TRANSCEIVER_TX HIGH
#define TRANSCEIVER_RX LOW
je vois que le programme a été modifié il y a quelques semaines, alors peut etre que c'est bon ?
et la, c'est galère sur galère.
déjà, il y a un
aucune aide en parle.
apres recherche, j'ai trouvé la librairie en question :
https://github.com/miko007/SerialTermin ... rminal.hpp
il faut enregistrer le fichier "SerialTerminal.hpp" (je pense que la casse (majuscule) est importante (?), attention), dans le meme dossier que le fichier .ino du transeiver.
je compile et a nouveau une erreur, malgré le fait que j'ai mis dans le meme dossier, il ne le trouve pas.
en cherchant la doc, j'ai compris que la syntaxe quand c'est un fichier n'est pas de le mettre entre < > mais " ".
je corrige donc en
tout en étant très surpris de devoir faire ce genre de correction sans que personne nule part en ai parlé ?
attention aussi quand vous allez creer votre fichier .hpp au format d'encodage du texte, vous pourriez avoir plein de petite erreur.
le mieux, pour ne pas se tromper, est d'ouvrir un nouvel onglet propre dans l'IDE, d'y copier / coller le texte directement, puis de sauvegarder depuis l'IDE.
cette fois ci, apres un CTRL+U, ca compile entièrement, ça passe.
reste à tester :
Ouvrir le moniteur série et régler la vitesse sur 57600.
Dans le moniteur série, taper la commande suivante : ERS 3 30
La chaudière doit démarrer et réguler la température de l'eau à 30 degrés
cette fois ci, c'est bien 57600 puisque c'est ainsi que c'est configuré sur le transeiver, contrairement à la version modifié de recepteur plus haut.
j'ai bien fait ce test, mais ...
.... je n'ai constaté AUCUN effet.
que faire ?
en outre, je me demande : comment la chaudiere se comporte en cas de reception d'ordre contradictoire entre le thermostat d'origine et le RFlink ? j'imagine qu'il faut retirer les piles du thermostat d'origine, tout simplement, non ?
d'ailleurs, sous question : n'y a t'il pas moyen de conserver en back le thermostat ?
j'imagine, pourquoi pas, creer un systeme avec un relais "normalement fermé" entre un set de pile et le thermostat. et raccorder ce relais a mon systeme domotique. il faut une COMMANDE pour le laisser ouvert (et donc le débrancher)
en cas de panne, le relais va fermer tout seul, du coup le thermostat sera a nouveau alimenté et s'activera.
par contre avec la prog d'origine, puisque je crois pas qu'il garde sa prog sans batterie. mais c'est toujours mieux que rien.
qu'en pensez vous ? quelqu'un a t'il deja fait ce genre de chose ?
il est fort dommage par contre de ne pas avoir de retour d'info de la chaudière, température, activation de la flamme, etc ... peut etre un jour prendrais je le temps de hacker la face avant de celle ci pour récupérer les états des lumières, voir commander les boutons, pour remonter les codes de panne ou autre.
je pourrais meme remplacer les deux petit robinet de remise en pression par des electrovanne pour commander un rechargement du circuit en automatique.
j'imagine qu'en utilisant de simple optocoupleur soudé en parrallèle des leds, et des relais pour les boutons / bouton poussoir, y'a moyen assez facilement de faire quelque chose.
ca sera un bon projet cet été, je pense

je partagerais ça ici, j'imagine que ca donnera des idées à des gens ...
a noter aussi que j'ai 3 capteurs de température (eau froide, eau chaude chauffage départ, eau chaude chauffage arrivé) et un compteur d'eau sur le circuit de chauffage ... autrement dit, de quoi faire un compteur thermique.
j'ai aussi 2 capteurs de pression sur l'arrivée d'eau générale, et sur le circuit de chauffage.
ca promet de petit montage sympa.
je suis par contre sur jeedom. désolé, je suis pas sur le bon fofo... mais le fait est que pour parler de cette bécane gaz, c'est, et de très loin, le meilleur topic possible. donc je pense que personne me le reprochera ^^
bravo en tout cas pour toute vos contribution passé. ca reste impressionnant.
merci d'avance a ceux qui pourront m'aider à comprendre ce qui continue de déconner avec le systeme actuel; je pense ne pas être très loin du résultat, mais bon ....
et j'espère que ma petite contribution / aide pourra servir aux prochains
