Bonjour,
J’ai avancé de mon côté sur mon installation de 2013 sans connect.
Pour rappel, j’ai 2 zones + un module hydraulique pour la régulation de la zone 2.
Je cherche à conserver mon installation d’origine pour conserver le fonctionnement des satellites en cas de panne de ma domotique.
J’ai fait quelques tests de principe:
- J’ai débranché ma chaudière pour voir le comportement du satellite.
Le satellite envoie 3 trams consécutive en incrémentant le byte 4 de 1.
Exemple:
Le satellite 1 (byte2 = 08) s’incrémente de 74 à 76 toutes les 4 secondes sans réponse de la chaudière.
19:05:57.315 -> RECEIVED [23] : 80 08 06 74 01 17 A0 29 00 15 A0 2F 00 04 08 00 CD 00 CD 00 05 00 00
19:06:01.213 -> RECEIVED [23] : 80 08 06 75 01 17 A0 29 00 15 A0 2F 00 04 08 00 CD 00 CD 00 05 00 00
19:06:05.094 -> RECEIVED [23] : 80 08 06 76 01 17 A0 29 00 15 A0 2F 00 04 08 00 CD 00 CD 00 05 00 00
Le satellite 2 (byte2 = 09) s’incrémente de 3C à 3E toutes les 4 secondes sans réponse de la chaudière.
19:06:21.615 -> RECEIVED [23] : 80 09 2C 3C 01 17 A0 29 00 15 A0 34 00 04 08 00 CA 00 C3 80 05 00 00
19:06:25.521 -> RECEIVED [23] : 80 09 2C 3D 01 17 A0 29 00 15 A0 34 00 04 08 00 CA 00 C3 80 05 00 00
19:06:29.389 -> RECEIVED [23] : 80 09 2C 3E 01 17 A0 29 00 15 A0 34 00 04 08 00 CA 00 C3 80 05 00 00
Lorsque ma chaudière ne renvoie pas de réponse, le satellite réessaye 2 fois de plus puis attend 10min pour réessayer en incrémentant de 1 de plus d’où l’incrément de 4 toutes les 10min quand la chaudière répond normalement.
J’ai donc essayé d’envoyer la tram du satellite modifié de la zone 2 avec une consigne de 5°C en mode hors gel juste après avoir reçu la réponse de la chaudière en incrémentant le byte 4 de 1 par rapport à la tram reçu juste avant du satellite.
- RECEIVED ==> Réception tram par heltech
- SEND ==> Envoie de la tram modifié par l’heltec)
22:30:54.593 -> RECEIVED [23] : 80 09 2C B8 01 17 A0 29 00 15 A0 34 00 04 08 00 C2 00 B9 80 00 00 00
22:30:54.670 -> RECEIVED [49] : 09 80 2C B8 81 17 2A 00 6B 00 00 25 01 05 22 30 36 08 00 00 C6 00 BE 00 00 00 00 00 00 00 C2 00 B9 80 00 00 00 00 00 04 F6 00 00 00 00 00 00 00 00
22:30:54.702 -> SEND____ [23] : 80 09 2C B9 01 17 A0 29 00 15 A0 34 00 04 08 00 C2 00 32 80 10 00 00
22:30:55.438 -> RECEIVED [49] : 09 80 2C B9 81 17 2A 00 6B 00 00 25 01 05 22 30 37 08 00 00 C6 00 BE 00 00 00 00 00 00 00 C2 00 32 80 10 00 00 00 00 04 F6 00 00 00 00 00 00 00 01
La chaudière répond deux fois.
Une première fois avec la consigne du satellite (00 B9 80 00) puis une deuxième fois avec la consigne modifié (00 32 80 10).
La première réponse n’est pas considéré par la chaudière. Je peux observer les trams envoyés quelques secondes plus tard au module hydraulique par la chaudière. La consigne de température de chauffage est modifié par rapport à la 2ème tram reçu par la chaudière.
Je vous partage mon fichier d’analyse sur le drive avec les trams que j’ai identifiés pour les satellites et le module hydraulique ainsi que quelques onglet pour décrypter les trams reçu.
@Burn , Il serait intéressant de les ajouter sur ton wiki. Peux-tu me donner accès en écriture ou peux-tu les ajouter ?
Je vous partage aussi mon code de test fait sur arduino pour renvoyer une tram modifié.
Je vais travailler sur un code d’intégration avec HomeAssist à partir du code de Burn. Je vais passer sur IO Platform pour rester cohérant.
Dans code ci-dessous, j’ai implémenté une interruption pour la réception radio afin d’éviter de bloquer le code pendant 12s suite à la réception. Je vous conseille d’utiliser cette méthode pour un code temps réel.
#include <Arduino.h>
#include <RadioLib.h>
SX1262 radio = new Module(SS, DIO0, RST_LoRa, BUSY_LoRa);
byte TramSat[RADIOLIB_SX126X_MAX_PACKET_LENGTH];
byte TramChaud[RADIOLIB_SX126X_MAX_PACKET_LENGTH];
byte TxByteArr[RADIOLIB_SX126X_MAX_PACKET_LENGTH];
byte byteArr[RADIOLIB_SX126X_MAX_PACKET_LENGTH];
bool StatusSat = false;
bool StatusChaud = false;
int LastLen;
// flag to indicate that a packet was received
volatile bool receivedFlag = false;
void setup() {
Serial.begin(115200);
int state = radio.beginFSK();
state = radio.setFrequency(868.96);
state = radio.setBitRate(25.0);
state = radio.setFrequencyDeviation(50.0);
state = radio.setRxBandwidth(250.0);
state = radio.setPreambleLength(4);
// Set your own adress
uint8_t network_id[] = {0x12, 0x34, 0x45, 0x67};
state = radio.setSyncWord(network_id, sizeof(network_id));
Serial.println("Prog Starting");
// set the function that will be called
// when new packet is received
radio.setPacketReceivedAction(setFlag);
// start listening for LoRa packets
Serial.print(F("[SX1262] Starting to listen ... "));
state = radio.startReceive();
if (state == RADIOLIB_ERR_NONE) {
Serial.println(F("success!"));
} else {
Serial.print(F("failed, code "));
Serial.println(state);
while (true);
}
}
// this function is called when a complete packet
// is received by the module
// IMPORTANT: this function MUST be 'void' type
// and MUST NOT have any arguments!
#if defined(ESP8266) || defined(ESP32)
ICACHE_RAM_ATTR
#endif
void setFlag(void) {
// we got a packet, set the flag
receivedFlag = true;
}
void loop() {
if(receivedFlag) {
// reset flag
receivedFlag = false;
int len = radio.getPacketLength();
LastLen = len;
//byte byteArr[len];
int state = radio.readData(byteArr, len);
radio.clearPacketReceivedAction();
//int state = radio.receive(byteArr, 0);
if (state == RADIOLIB_ERR_NONE || state == RADIOLIB_ERR_CRC_MISMATCH) {
Serial.printf("RECEIVED [%2d] : ", len);
for (int i = 0; i < len; i++)
Serial.printf("%02X ", byteArr[i]);
Serial.println("");
// Check Sat
if ( len == 23 && (byteArr[0] == 0x80) && (byteArr[1] == 0x09) && (byteArr[4] == 0x01)){
//Serial.println("Envoie tram satellite modifié");
StatusSat = true;
// Record last satellite tram
for (int i = 0; i < len; i++){
TramSat[i] = byteArr[i];
TxByteArr[i] = byteArr[i];
}
}
// CRC error
if (state == RADIOLIB_ERR_CRC_MISMATCH){
Serial.println("Radio CRC error");
}
} else {
Serial.print("Radio State: ");Serial.println(state);
}
}
if (StatusSat == true && LastLen == 49 && (byteArr[0] == 0x09) && (byteArr[1] == 0x80) && (byteArr[4] == 0x81))
{
StatusSat = false;
// Change setpoint
TxByteArr[3] += 1;
TxByteArr[17] = 0x00;
TxByteArr[18] = 0x32;// 0xE6: 23°C 0x32: 5°C
TxByteArr[20] = 0x10;// 0x10: Dérogation Hors Gel
// Transmit new data
int state = radio.transmit(TxByteArr, 23);
if (state == RADIOLIB_ERR_NONE)
{
//Serial.println("Transmission réussie");
Serial.printf("SEND____ [%2d] : ", 23);
for (int i = 0; i < 23; i++)
Serial.printf("%02X ", TxByteArr[i]);
Serial.println();
// start listening for LoRa packets
//Serial.print(F("[SX1262] Starting to listen ... "));
receivedFlag = false;
state = radio.startReceive();
if (state != RADIOLIB_ERR_NONE) {
Serial.print(F("startReceive failed, code "));
Serial.println(state);
}
}
else
{
Serial.println("Erreur lors de la transmission");
}
}
}
@mgre , J’ai aussi des problèmes de réception des trams de la chaudière. En creusant, le checksum est en erreur mais la tram est bien reçu. Dans mon code ci-dessus, je reçois les tram avec checksum invalide. J’observe très peu d’écart dans les tram identifié avec erreur (Dernier onglet de mon fichier Excel).
As-tu trouvé une solution au problème ?
J’ai testé différentes configurations radio sans succès.
Dans mon concept, le problème est gênant !!!
Au plaisir de vous lire.