Domotisation Frisquet Prestige Condensation Eco Radio System

Oui, c’est ce que j’ai utilisé.
Bon, il va falloir que je creuse mais je ne suis pas un expert dans tout ca :smirk:

Hello @ngrataloup,

Je n’ai pas eu le temps de me pencher sur l’émission depuis. Tu peux voir sur ce post les réflexions que j’avais eues pour l’émission, mais sans avoir eu le temps de les tester. Le post de benoit juste en-dessous apportait la solution, qui semblait être assez cohérente de ce que j’avais identifié pour les pins.

Si tu arrives à faire marcher je suis preneur.

Une personne a contribué sur Github en disant avoir trouvé la solution. J’ai intégré la solution. @ParkerLewis, peux-tu tester s’il te plaît ?

Bonsoir Christophe,

Bonne nouvelle, ca fonctionne !!! :star_struck:
Merci beaucoup

J’ai refait le script de l’arduino qui ne fonctionnait pas par contre.
1 - rajout d’un else dans le if(Bit) dans la fonction writeBit. je ne comprends pas comment ca peut fonctionné sans !

void writeBit(bool Bit) {
  old_state = !old_state;
  digitalWrite(TRANSCEIVER_TX_PIN, old_state);
  delayMicroseconds(long_pulse);

  if (Bit) {
    old_state = !old_state;
    digitalWrite(TRANSCEIVER_TX_PIN, old_state);
  }
  else {
    digitalWrite(TRANSCEIVER_TX_PIN, old_state);
  }
  delayMicroseconds(long_pulse);
}

2 - et refonte du loop(), suppression de tout ce qui est maschinendeck::SerialTerminal term;* et suppression de la fonction ERS_command (je ne comprenais pas le fonctionnement de ton script - je ne suis pas un expert :wink:)

au final, voilà le script qui fonctionne sur mon PC :

#include <SerialTerminal.hpp>

#define TRANSCEIVER_TX_PIN      14    // 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

// Variables
int long_pulse = 825;
byte message[17] = {0x00, 0x00, 0x00, 0x7E, 0x3A, 0x2D, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x00, 0xFF, 0x80};
byte old_state, num_byte;
byte bitstuff = 0;

void writeBit(bool Bit) {
  old_state = !old_state;
  digitalWrite(TRANSCEIVER_TX_PIN, old_state);
  delayMicroseconds(long_pulse);

  if (Bit) {
    old_state = !old_state;
    digitalWrite(TRANSCEIVER_TX_PIN, old_state);
  }
  else {
    digitalWrite(TRANSCEIVER_TX_PIN, old_state);
  }
  delayMicroseconds(long_pulse);
}

void conversion(byte input) {
  for (byte n = 0; n < 8; n++) { // boucle pour chaque bit
    writeBit(bitRead(input, n));
    if (num_byte >= 4 && num_byte <= 14) {
      if (bitRead(input, n) == 1) bitstuff++;  // incrémente le compteur bitstuffing
    }
    if (bitRead(input, n) == 0) bitstuff = 0;
    if (bitstuff >= 5) {
      writeBit(0);
      bitstuff = 0;
    }
  }
}

void commande(byte mode, byte temperature) {
  if ((temperature <= 100) and ((mode==0) or (mode==3) or (mode==4))) {
    for (byte x = 0; x < 3; x++) { // boucle de 3 messages
      old_state = 0;
      
      // Message 9 --> numero de message 0 à 2
      message[9] = x;  
      
      // Message : 10 -> mode
      if (x == 2) message[10] = mode;
      else message[10] = mode + 0x80;

      // Message : 11 -> temperature
      message[11] = temperature;
      
      // Messages 13 et 14 -> checksum
      int checksum = 0;
      for (int i = 4; i <= 12; i++) {
        checksum -= message[i];
      }
      message[13] = highByte(checksum);
      message[14] = lowByte(checksum);

      Serial.print("Trame ");
      Serial.print(x);
      Serial.print(" : ");
      
      for (int i = 1; i <= 16; i++) {
        if (message[i] <= 0x0F) Serial.print("0");
        Serial.print(message[i], HEX);
      }
      Serial.println("");
      
      for (int i = 1; i <= 16; i++) { // boucle de 16 bytes
          conversion(message[i]);
      }
      
      digitalWrite(TRANSCEIVER_TX_PIN, LOW);
      delay(33);
    }
    digitalWrite(TRANSCEIVER_TX_PIN, LOW);
  } else {
    return;
  }
}

void setup() {
  // set the Aurel transceiver to RX mode
  pinMode(TRANSCEIVER_MODE_PIN, OUTPUT);
  digitalWrite(TRANSCEIVER_MODE_PIN, HIGH);

  // 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_TX_PIN, OUTPUT);
  digitalWrite(TRANSCEIVER_TX_PIN, LOW);
  
  pinMode (LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
   
  Serial.begin(9600) ;

}

void loop() {

  String chaineCaractere = "" ;
  String mode = "" ;
  String modeTexte = "" ;
  String temperature = "" ;
  char   acquisDonnees = "" ;
  int    nbTerme = 0 ;
  
  while (Serial.available() > 0) {
    acquisDonnees = Serial.read() ;
    delay(80) ;
    
    if ( acquisDonnees != 32 && acquisDonnees != 10 )  chaineCaractere = chaineCaractere + acquisDonnees  ;
    else {
      switch (nbTerme) {
        case 0:
          Serial.println("##### Reception de parametres #####");
          chaineCaractere = "" ;
          nbTerme++ ;
          break;
        case 1 :  // 1ere option  --> remontée du mode
          mode = chaineCaractere ;
          chaineCaractere = "" ;
          nbTerme++ ;
          switch (mode.toInt()) {
            case 0: 
              modeTexte = "Hors Gel" ;
              break ;
            case 3:
              modeTexte = "Confort" ;
              break ;
            case 4:
              modeTexte = "Eco" ;
              break ;            
          }
          break ;  
        case 2 :  // 2nd option  --> remontée de la temperature
          temperature = chaineCaractere.toInt() ;
          chaineCaractere = "" ;
          nbTerme++ ;
          break ;  
       }
    }

    if ( nbTerme == 3 ) { 
      Serial.println("Lancement commande avec parametres : ");
      Serial.println("     Mode            --> " + mode + " - " + modeTexte );
      Serial.println("     Temperature eau --> " + temperature + "°C"); 
      commande(mode.toInt(),temperature.toInt()) ;
      Serial.println("##### Commandes envoyées #####");
      Serial.println("");
    }
  }     
}

Reste plus qu’à le faire fonctionner sur Jeedom … mais j’ai un pb d’alimentation. HUB USB alimenté en attente de livraison.

Merci pour ton travail !!!

Je ne sais pas et je ne vais pas chercher à changer ma configuration car cela fonctionne très bien comme ça.

Je l’ai intégré tel quel dans Github pour les prochains qui voudraient tenter l’aventure. J’ai simplement retiré l’identifiant de ta chaudière.

C’est un travail collectif où une dizaine de personnes ont apportés leur pierre à la solution. J’essaie juste de tenir à jour un Github avec une documentation car c’est ce que j’aurais aimé trouver pour gagner du temps dans ce projet.

1 « J'aime »

Bonjour à tous,

Désolé @ChristopheHD, je n’avais pa du configurer les notifs en cas de mention et je ne vois ton message que tardivement.

Néanmoins je vais partager ici la même chose que sur l’autre topic.

Merci beaucoup encore à tous pour les contributions.

Grâce au script avec les modifs @ngrataloup, j’ai également réussi à commander la chaudière avec mon Arduino à chip Aurel :slight_smile: :slight_smile: :slight_smile:

Une commande type « ERS 3 60 » a bien déclenché le fonctionnement de la chaudière (après quelques secondes). Je n’ai pas été jusqu’à attendre / vérifier que l’eau monte bien jusque 60° (il fait déjà 25°, ça ira :)) mais je pense que c’est bon sur cet aspect. Ou en tout cas ce n’est plus un problème maintenant normalement.

Une commande « ERS 4 15 » a ensuite bien conduit la chaudière à ralentir puis s’arrêter.

Je confirme donc que le « frisquet-ERS-command-transceiver » (en tout cas la version « Latest commit c04f0f4 on 6 Apr ») fonctionne avec le modèle NODO-SHOP :slight_smile:

Pour info tout de même :

  • Il m’a fallu éditer la première ligne, ie remplacer
#include <SerialTerminal.hpp>

par

#include "SerialTerminal.hpp"

Sans ça la compilation plantait (« SerialTerminal.hpp : No such file or directory »). peut-être que si c’est entre crochets faut le mettre ailleurs (dans un répertoire du path windows par ex ?). Ne sais pas. En tout cas en mettant ce fichier (https://github.com/miko007/SerialTerminal/blob/master/SerialTerminal.hpp) dans le même répertoire que le .ino, et avec les guillemets, ça a marché.

D’ailleurs, ce script additionnel est-il nécessaire, notamment depuis les suppressions de @ngrataloup ? je ne vois pas où on y ferait encore appel d’une quelconque manière, et les messages présents dans le .hpp en question ne sont jamais affichés à la console. Bref je pense que cette ligne et donc ce fichier sont désormais superflus. Il suffirait que je teste en enlevant la ligne, mais là je ne peux pas pour l’instant.

  • Il y a un warning à la compilation, vraisemblablement sans conséquence, néanmoins le voici :

In function 'void loop()': 116:26: warning: invalid conversion from 'const char*' to 'char' [-fpermissive]

A priori c’est tout :+1:

A part ça, question plus générale : une raison pour laquelle sur certains scripts le terminal est init en 9600, d’autres en 57600, … à chaque fois je me fais avoir au moins une fois avant de me rendre compte que la console n’est pas réglée comme il faut.

Bonjour @ParkerLewis

J’ai quelques peu modifié et amélioré le script proposé … effectivement, le 9600 est un reste de mes tests. je suis repassé en 57600. j’ai aussi intégré le fait de traiter la ligne complete qui arrive par le port serie et pas les caractères 1 par 1 !
Ca simplifie grandement la lisibilité du script
Enfin, je gère le retour à Jeedom de la température envoyée par le script à la chaudière, avec possibilité (je pense mais pas testé) d’avoir une erreur jeedom si la température d’eau n’a pas été mise à jour depuis x min/h, puisqu’elle remonte en retour de la commande script

#define TRANSCEIVER_TX_PIN 14 // 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

// Variables
int long_pulse = 825;
byte message[17] = {
  0x00,
  0x00,
  0x00,
  0x7E,
  0x3A,
  0x2D,
  0x00,
  0x20,
  0x00,
  0x00,
  0x00,
  0x00,
  0x00,
  0xFD,
  0x00,
  0xFF,
  0x80
};
byte old_state, num_byte;
byte bitstuff = 0;

String chaineCaractere = "";
String mode = "";
String temperature = "";

void writeBit(bool Bit) {
  old_state = !old_state;
  digitalWrite(TRANSCEIVER_TX_PIN, old_state);
  delayMicroseconds(long_pulse);
  if (Bit) {
    old_state = !old_state;
    digitalWrite(TRANSCEIVER_TX_PIN, old_state);
  } else {
    digitalWrite(TRANSCEIVER_TX_PIN, old_state);
  }
  delayMicroseconds(long_pulse);
}

void conversion(byte input) {
  for (byte n = 0; n < 8; n++) { // boucle pour chaque bit
    writeBit(bitRead(input, n));
    if (num_byte >= 4 && num_byte <= 14) {
      if (bitRead(input, n) == 1) bitstuff++; // incrémente le compteur bitstuffing
    }
    if (bitRead(input, n) == 0) bitstuff = 0;
    if (bitstuff >= 5) {
      writeBit(0);
      bitstuff = 0;
    }
  }
}

void commande(byte mode, byte temperature) {
  if ((temperature <= 100) and((mode == 0) or(mode == 3) or(mode == 4))) {
    for (byte x = 0; x < 3; x++) { // boucle de 3 messages
      old_state = 0;

      // Message 9 --> numero de message 0 à 2
      message[9] = x;

      // Message : 10 -> mode
      if (x == 2) message[10] = mode;
      else message[10] = mode + 0x80;

      // Message : 11 -> temperature
      message[11] = temperature;

      // Messages 13 et 14 -> checksum
      int checksum = 0;
      for (int i = 4; i <= 12; i++) {
        checksum -= message[i];
      }
      message[13] = highByte(checksum);
      message[14] = lowByte(checksum);
      for (int i = 1; i <= 16; i++) { // boucle de 16 bytes
        conversion(message[i]);
      }
      //digitalWrite(LED_BUILTIN, LOW);

      digitalWrite(TRANSCEIVER_TX_PIN, LOW);
      delay(33);
    }
    digitalWrite(TRANSCEIVER_TX_PIN, LOW);
  } else {
    return;
  }
}

String getValue(String data, char separator, int index) {
  int found = 0;
  int strIndex[] = {
    0,
    -1
  };
  int maxIndex = data.length() - 1;

  for (int i = 0; i <= maxIndex && found <= index; i++) {
    if (data.charAt(i) == separator || i == maxIndex) {
      found++;
      strIndex[0] = strIndex[1] + 1;
      strIndex[1] = (i == maxIndex) ? i + 1 : i;
    }
  }

  return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
}

void setup() {
  // set the Aurel transceiver to RX mode
  pinMode(TRANSCEIVER_MODE_PIN, OUTPUT);
  digitalWrite(TRANSCEIVER_MODE_PIN, HIGH);

  // 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_TX_PIN, OUTPUT);
  digitalWrite(TRANSCEIVER_TX_PIN, LOW);

  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);

  Serial.begin(57600);

}

void loop() {

  if (Serial.available() > 0) {
    chaineCaractere = Serial.readStringUntil('\n');;
    delay(80);

    mode = getValue(chaineCaractere, ' ', 1);
    temperature = getValue(chaineCaractere, ' ', 2);

    commande(mode.toInt(), temperature.toInt());
    Serial.print(temperature.toInt());
  }
}

le script :

#!/usr/bin/env python3
# argv[1] is the mode in french : 0 - Eco, 3 - Confort, 4 - Hors gel
# argv[2] is the temperature we want in °C

import sys
import time
import serial

mode = sys.argv[1]

temperature = int(sys.argv[2])

command = "ERS " + str(int(mode)) + " " + str(int(temperature)) + "\n"

arduino = serial.Serial(port="/dev/ttyACM0", baudrate=57600, timeout=.1)
time.sleep(2)
arduino.write(command.encode('utf-8'))
time.sleep(1)
retourtemp= arduino.readline().decode('utf-8')
arduino.close()

print(retourtemp)

A noter que pour éviter de mettre trop de calculs dans ce script, j’ai externalisé la formule de calcul dans un scenario et le mappage des modes en entier.ets aussi fait dans le scenario

Le script remonte donc « retourtemp » sur la sortie standard (qui est normalement ce qui ai envoyé à la chaudière, car valeur remontée par l’arduino

Top @ngrataloup.

A-t-on encore besoin de

#include <SerialTerminal.hpp>

? Il me semble que non.

Merci aussi pour le versant Jeedom. J’avance aussi pas à pas et ne m’étais pas encore penché sur cet aspect (j’attendais d’avoir déjà une commande chaudière fonctionnelle, forcément…) Après il y aura aussi le sujet de la gestion de tout ça… on verra à ce moment-là, étape par étape…

Ca fonctionne effectivement sans le include, programme arduino mis à jour au dessus

Re,

voici une proposition de maj du script.

C’est en gros la dernière version proposée par @ngrataloup , en reprenant / rajoutant et étendant les affichages d’infos à la console présents dans la version de @ChristopheHD. L’affichage a lieu que les infos soient valides ou non, et indique si valide ou invalide (et n’envoie bien sûr une trame que si tout est valide).

J’ai aussi rajouté pas mal de commentaires.

Enfin j’ai mis un critère de rejet supplémentaire sur la commande (la température d’eau demandée doit être supérieure à 10°). A voir si c’est pertinent ou s’il conviendrait uniquement de saturer (applicable aussi à la borne max d’ailleurs, par ex avec un x=min(max(10,x),90)).

Voici. (Ca tourne nickel chez moi)


#define TRANSCEIVER_TX_PIN      14    // Set the pin that emits data towards the 433.42 Mhz Transmitter
#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

// Variables
int long_pulse = 825;
byte message[17] = {0x00, 0x00, 0x00, 0x7E, 0x??, 0x??, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x00, 0xFF, 0x80};
byte old_state, num_byte;
byte bitstuff = 0;

String chaineCaractere = "";
String mode = "";
String temperature = "";
String modeTexte = "" ;
String tempTexte = "" ;
String invalide = "INVALIDE";

// A l'init
// Setup du chip Aurel
void setup() {
  // set the Aurel transceiver to RX mode
  pinMode(TRANSCEIVER_MODE_PIN, OUTPUT);
  digitalWrite(TRANSCEIVER_MODE_PIN, HIGH);

  // 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_TX_PIN, OUTPUT);
  digitalWrite(TRANSCEIVER_TX_PIN, LOW);

  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);

  Serial.begin(57600);
}

// En continu
// Surveillance et émission de trame si commande texte
void loop() {

  if (Serial.available() > 0) {

    Serial.println("##### Réception d'une commande #####");

    // Récup de l'input (ligne de commande)
    chaineCaractere = Serial.readStringUntil('\n');;
    delay(80);

    // Récup des deux infos pertinentes de la commande texte
    mode = getValue(chaineCaractere,' ',1);
    temperature = getValue(chaineCaractere,' ',2);

    // Interprétation & validité
    modeTexte=invalide;
    tempTexte=invalide;
    switch (mode.toInt()) {
      case 0:
        modeTexte="Hors Gel";break;
      case 3:
        modeTexte="Confort";break;
      case 4:
        modeTexte="Eco";break;
    }
    if (temperature.toInt()>=10 and temperature.toInt()<=100) tempTexte="ok";
    Serial.println("    Mode   --> " + mode + " - " + modeTexte );
    Serial.println("    T° eau --> " + temperature + "°C - " + tempTexte);

    // Action en conséquence
    if (tempTexte==invalide or modeTexte==invalide) {
      // Commande invalide => on signale mais on ne fait rien
      Serial.println("##### Commande invalide ignorée ! #####");
    } else {
      // Commande valide => génération et émission de la trame
      Serial.println("Génération des trames...");
      commande(mode.toInt(), temperature.toInt());
      Serial.println("##### Commande traitée #####");
    }
    Serial.println("");
  }
}

// Génération et émission d'une trame
void commande(byte mode, byte temperature) {

  for (byte x = 0; x < 3; x++) { // boucle de 3 messages

    // Génération de la trame
    // **********************

    old_state = 0;

    // Message 9 --> numéro de message 0 à 2
    message[9] = x;

    // Message : 10 -> mode
    if (x == 2) message[10] = mode;
    else message[10] = mode + 0x80;

    // Message : 11 -> temperature
    message[11] = temperature;

    // Messages 13 et 14 -> checksum
    int checksum = 0;
    for (int i = 4; i <= 12; i++) {
      checksum -= message[i];
    }
    message[13] = highByte(checksum);
    message[14] = lowByte(checksum);

    Serial.print("Trame ");
    Serial.print(x);
    Serial.print(" : ");

    for (int i = 1; i <= 16; i++) {
      if (message[i] <= 0x0F) Serial.print("0");
      Serial.print(message[i], HEX);
    }
    Serial.println("");

    // Emission de la trame
    // ********************
    for (int i = 1; i <= 16; i++) { // boucle de 16 bytes
      conversion(message[i]);
    }
    digitalWrite(TRANSCEIVER_TX_PIN, LOW);
    delay(33);
  }
  digitalWrite(TRANSCEIVER_TX_PIN, LOW);
}

// "Emission"
// Pas complètement boîte aux lettres car il y a un bitstuffing à faire
void conversion(byte input) {
  for (byte n = 0; n < 8; n++) { // boucle pour chaque bit
    // Emission proprement dite du bit
    writeBit(bitRead(input, n));
    // Bitstuffing
    if (num_byte >= 4 && num_byte <= 14) {
      if (bitRead(input, n) == 1) bitstuff++; // incrémente le compteur bitstuffing
    }
    if (bitRead(input, n) == 0) bitstuff = 0;
    if (bitstuff >= 5) {
      writeBit(0);
      bitstuff = 0;
    }
  }
}

// Emission bit à bit bas niveau
void writeBit(bool Bit) {
  old_state = !old_state;
  digitalWrite(TRANSCEIVER_TX_PIN, old_state);
  delayMicroseconds(long_pulse);
  if (Bit) {
    old_state = !old_state;
    digitalWrite(TRANSCEIVER_TX_PIN, old_state);}

  else {
    digitalWrite(TRANSCEIVER_TX_PIN, old_state);
  }
  delayMicroseconds(long_pulse);
}

// Récup du n-ème mot dans un string (n=index)
String getValue(String data, char separator, int index) {
  int found = 0;
  int strIndex[] = {
    0,
    -1
  };
  int maxIndex = data.length() - 1;
  for (int i = 0; i <= maxIndex && found <= index; i++) {
    if (data.charAt(i) == separator || i == maxIndex) {
      found++;
      strIndex[0] = strIndex[1] + 1;
      strIndex[1] = (i == maxIndex) ? i + 1 : i;
    }
  }
  return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
}
1 « J'aime »

@hakkanicko me fait remarquer sur Github que vous avez modifié les valeurs des modes. Je ne sais pas si la chaudière prend ce flag en compte, mais si c’est le cas elle modifie le comportement de l’eau chaude sanitaire, il vaudrait mieux revenir aux valeurs d’origines.

Vous parlez des modes et de leur numéro ?
Eco → 0
Confort → 3
Hors gel → 4

Norbert

Oui, tout à fait, dans le programme d’origine que j’ai forké, il y avait :

// reduit 0, confort 3, hors gel 4, chauffage 0 à 100

Mais dans le reverse engineering du protocole, il y a autre chose :

Pre-heated Water: 0x80 for ON, 0x88 for OFF (bit 8 always set, bit 4 indicates water)

Merci pour la correction coté github. je pense que j’avais corrigé chez moi puisque j’avais bien les bonnes valeurs (je ne me souviens plus !)

Norbert

Merci @ChristopheHD pour la remarque. Sur ce sujet j’étais reparti du passage posté par @ngrataloup sans vérifier l’éventuelle différence avec ta version.

Par rapport à ce que j’ai posté plushaut, il suffit de modifier la valeur de la variable modeTexte (qui est non fonctionnelle et ne sert qu’à l’affichage console) dans la fonction loop(), c’est ça ? Tout le reste est juste ? du coup, il n’y avait qu’une erreur d’affichage console ?

N’ayant pas encore tous mes corps de vanne thermostatique, je m’étais contenté de vérifier que la chaudière réagissait en termes de chauffage, mais du coup effectivement je n’avais pas testé les aspects ECS ex, le mode pouvait ne pas être juste…

Si je modifie ainsi (unique modif par rapport à précédent = maj de la variable modeTexte), c’est bon ?


#define TRANSCEIVER_TX_PIN      14    // Set the pin that emits data towards the 433.42 Mhz Transmitter
#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

// Variables
int long_pulse = 825;
byte message[17] = {0x00, 0x00, 0x00, 0x7E, 0x??, 0x??, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x00, 0xFF, 0x80};
byte old_state, num_byte;
byte bitstuff = 0;

String chaineCaractere = "";
String mode = "";
String temperature = "";
String modeTexte = "" ;
String tempTexte = "" ;
String invalide = "INVALIDE";

// A l'init
// Setup du chip Aurel
void setup() {
  // set the Aurel transceiver to RX mode
  pinMode(TRANSCEIVER_MODE_PIN, OUTPUT);
  digitalWrite(TRANSCEIVER_MODE_PIN, HIGH);

  // 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_TX_PIN, OUTPUT);
  digitalWrite(TRANSCEIVER_TX_PIN, LOW);

  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);

  Serial.begin(57600);
}

// En continu
// Surveillance et émission de trame si commande texte
void loop() {

  if (Serial.available() > 0) {

    Serial.println("##### Réception d'une commande #####");

    // Récup de l'input (ligne de commande)
    chaineCaractere = Serial.readStringUntil('\n');;
    delay(80);

    // Récup des deux infos pertinentes de la commande texte
    mode = getValue(chaineCaractere,' ',1);
    temperature = getValue(chaineCaractere,' ',2);

    // Interprétation & validité
    modeTexte=invalide;
    tempTexte=invalide;
    switch (mode.toInt()) {
      case 0:
        modeTexte="Réduit";break;
      case 3:
        modeTexte="Confort";break;
      case 4:
        modeTexte="Hors Gel";break;
    }
    if (temperature.toInt()>=10 and temperature.toInt()<=100) tempTexte="ok";
    Serial.println("    Mode   --> " + mode + " - " + modeTexte );
    Serial.println("    T° eau --> " + temperature + "°C - " + tempTexte);

    // Action en conséquence
    if (tempTexte==invalide or modeTexte==invalide) {
      // Commande invalide => on signale mais on ne fait rien
      Serial.println("##### Commande invalide ignorée ! #####");
    } else {
      // Commande valide => génération et émission de la trame
      Serial.println("Génération des trames...");
      commande(mode.toInt(), temperature.toInt());
      Serial.println("##### Commande traitée #####");
    }
    Serial.println("");
  }
}

// Génération et émission d'une trame
void commande(byte mode, byte temperature) {

  for (byte x = 0; x < 3; x++) { // boucle de 3 messages

    // Génération de la trame
    // **********************

    old_state = 0;

    // Message 9 --> numéro de message 0 à 2
    message[9] = x;

    // Message : 10 -> mode
    if (x == 2) message[10] = mode;
    else message[10] = mode + 0x80;

    // Message : 11 -> temperature
    message[11] = temperature;

    // Messages 13 et 14 -> checksum
    int checksum = 0;
    for (int i = 4; i <= 12; i++) {
      checksum -= message[i];
    }
    message[13] = highByte(checksum);
    message[14] = lowByte(checksum);

    Serial.print("Trame ");
    Serial.print(x);
    Serial.print(" : ");

    for (int i = 1; i <= 16; i++) {
      if (message[i] <= 0x0F) Serial.print("0");
      Serial.print(message[i], HEX);
    }
    Serial.println("");

    // Emission de la trame
    // ********************
    for (int i = 1; i <= 16; i++) { // boucle de 16 bytes
      conversion(message[i]);
    }
    digitalWrite(TRANSCEIVER_TX_PIN, LOW);
    delay(33);
  }
  digitalWrite(TRANSCEIVER_TX_PIN, LOW);
}

// "Emission"
// Pas complètement boîte aux lettres car il y a un bitstuffing à faire
void conversion(byte input) {
  for (byte n = 0; n < 8; n++) { // boucle pour chaque bit
    // Emission proprement dite du bit
    writeBit(bitRead(input, n));
    // Bitstuffing
    if (num_byte >= 4 && num_byte <= 14) {
      if (bitRead(input, n) == 1) bitstuff++; // incrémente le compteur bitstuffing
    }
    if (bitRead(input, n) == 0) bitstuff = 0;
    if (bitstuff >= 5) {
      writeBit(0);
      bitstuff = 0;
    }
  }
}

// Emission bit à bit bas niveau
void writeBit(bool Bit) {
  old_state = !old_state;
  digitalWrite(TRANSCEIVER_TX_PIN, old_state);
  delayMicroseconds(long_pulse);
  if (Bit) {
    old_state = !old_state;
    digitalWrite(TRANSCEIVER_TX_PIN, old_state);}

  else {
    digitalWrite(TRANSCEIVER_TX_PIN, old_state);
  }
  delayMicroseconds(long_pulse);
}

// Récup du n-ème mot dans un string (n=index)
String getValue(String data, char separator, int index) {
  int found = 0;
  int strIndex[] = {
    0,
    -1
  };
  int maxIndex = data.length() - 1;
  for (int i = 0; i <= maxIndex && found <= index; i++) {
    if (data.charAt(i) == separator || i == maxIndex) {
      found++;
      strIndex[0] = strIndex[1] + 1;
      strIndex[1] = (i == maxIndex) ? i + 1 : i;
    }
  }
  return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
}

Oui, oui et oui.

Oui.

Calà dit, quel est l’effet de cet valeur (0, 3 ou 4) sur le fonctionnement de la chaudière ?
J’ai quand même l’impression que coté télécommande d’origine, cette info ne sert qu’à déterminer une valeur de consigne (et donc une température d’eau)

J’ai aussi du mal à comprendre, du coup, les lignes suivantes dans le programme :

    if (x == 2) message[10] = mode;
    else message[10] = mode + 0x80;

pour le message 10, on est très loin des valeurs 0x80 pour ON ou 0x88 pour OFF

Bonjour,
Suite à la lecture de ce post je me suis lancé j’ai donc acheté le module RFLink 433.42 (Somfy RTS) / Arduino / Antenne / USB cable de chez nodo.

J’arrive à brancher la carte, mais quand je lance avec le arduino le code https://github.com/ChristopheHD/frisquet-arduino/blob/main/frisquet-ERS-decode/frisquet-ERS-decode-transceiver.ino cela n’affiche rien, même si je change la consigne.
Si je met un print dans la loop je voit bien que mon print s’affiche dans la console, de même si j’actionne un équipement 433 Mhz poche mais rien avec mon module frisquet.
J’ai l’impression qu’il existe deux module de commande, le mien est le siemens comme celui de cette photo https://www.picclickimg.com/d/l400/pict/153783626033_/Chaudiere-frisquet-Prestige.jpg J’espère que je ne me suis pas trompé…

Merci de votre aide

Ton thermostat a l’air d’être un frisquet satellite des années 2000,
Ce thread traite de la gestion du système frisquet eco radio system (2010 environ)
A mon avis, pas d’espoir de faire fonctionner sur un autre système que l’eco radio

Norbert

1 « J'aime »

J’ai mis à jour le Wiki avec une photo du thermostat Eco Radio System pour éviter à l’avenir que quelqu’un se trompe sur le thermostat que l’on peut remplacer.

3 « J'aime »