Bonjour et un grand merci !!!
c’est exactement ce que je cherchais… Je vais étudier ça, je crois qu’on tient le bon bout…
Bonjour et un grand merci !!!
c’est exactement ce que je cherchais… Je vais étudier ça, je crois qu’on tient le bon bout…
Je suis interessé par le code, j’essaie de faire la meme chose mais j’ai des problèmes.
Tu peux forker le repo de git et faire une branche sur ton fork.
Si quelqu’un pouvait poster le code pour envoyer une trame en se faisant passer pour Connect.
Je suis en train d’exploiter de code de Burn, j’y ai ajouté la gestion de l’écran, ce qui permet d’avoir les info en continu sur l’écran OLED.
Je l’envoie tout à l’heure.
Pas sur mon pc.
Voici un exemple, ça utilise aussi l"écran OLED, il faut enlever l’affichage du logo vu que je n’ai pas poster le code complet, mais ça montre l’envoi d’un message Connect vers Chaudière. Il faut remplacer l’Id de la chaudière et l’id (ici 0x20 à remplacer en fct de celui reçu lors de l’association) dans les messages (3ème octet)
/*
Code Base from RadioLib: https://github.com/jgromes/RadioLib/tree/master/examples/SX126x
For full API reference, see the GitHub Pages
https://jgromes.github.io/RadioLib/
*/
#include <Arduino.h>
#include <RadioLib.h>
#include "images.h"
#include <Wire.h>
#include "HT_SSD1306Wire.h"
#define Fsk_MOSI 10
#define Fsk_MISO 11
#define Fsk_SCK 9
#define Fsk_nss 8
#define Fsk_dio1 14
#define Fsk_nrst 12
#define Fsk_busy 13
String rssi = "RSSI --";
String packSize = "--";
String packet1, packet2;
String send_num;
String show_DateTime = "--:--:--";
unsigned int counter = 0;
byte TxByteArr[]= {0x80, 0x7E, 0x20 /*Id msg*/ , 0x00,
0x01, 0x03,
0x79, 0xE0, 0x00, 0x1C}; // Msg Connect / Chaudière de demande d'info
byte Tx2ByteArr[]= {0x80, 0x7E, 0x20, 0x00,
0x01, 0x03,
0x79, 0xE0, 0x00, 0x1C};
SX1262 radio = new Module(Fsk_nss, Fsk_dio1, Fsk_nrst, Fsk_busy);
SSD1306Wire factory_display(0x3c, 500000, SDA_OLED, SCL_OLED, GEOMETRY_128_64, RST_OLED); // addr , freq , i2c group , resolution , rst
void logo(){
factory_display.clear();
factory_display.drawXbm(0,5,logo_width,logo_height,(const unsigned char *)logo_bits);
factory_display.display();
}
void VextON(void)
{
pinMode(Vext,OUTPUT);
digitalWrite(Vext, LOW);
}
void VextOFF(void) //Vext default OFF
{
pinMode(Vext,OUTPUT);
digitalWrite(Vext, HIGH);
}
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);
uint8_t network_id[] = {0x05, 0xDA, 0xNN, 0xNN}; // ID de la chaudière
// uint8_t network_id[] = {0xFF, 0xFF, 0xFF, 0xFF}; // Broadcast id
state = radio.setSyncWord(network_id, sizeof(network_id));
if (state != RADIOLIB_ERR_NONE) {
Serial.print(F("Unable to set configuration, code "));
Serial.println(state);
while (true);
}
VextON();
delay(100);
factory_display.init();
factory_display.clear();
factory_display.display();
logo();
delay(300);
factory_display.clear();
factory_display.setFont(ArialMT_Plain_10);
packet1 ="waiting FSK data!";
factory_display.drawString(0, 0, "0");
factory_display.drawString(0, 13, "13");
factory_display.drawString(0, 26, "26");
factory_display.drawString(0, 39, "39");
factory_display.drawString(0, 52, "52");
factory_display.display();
delay(100);
factory_display.clear();
pinMode(LED ,OUTPUT);
digitalWrite(LED, LOW);
state = radio.transmit(Tx2ByteArr, 10);
if (state == RADIOLIB_ERR_NONE) {
Serial.println(F("[SX1262] Packet transmitted successfully!"));
} else if (state == RADIOLIB_ERR_PACKET_TOO_LONG) {
Serial.println(F("[SX1262] Packet too long!"));
} else if (state == RADIOLIB_ERR_TX_TIMEOUT) {
Serial.println(F("[SX1262] Timed out while transmitting!"));
} else {
Serial.println(F("[SX1262] Failed to transmit packet, code "));
Serial.println(state);
}
}
void loop()
{
float valExt = 0.0, valInt = 0.0, valCons = 0.0;
byte byteArr[RADIOLIB_SX126X_MAX_PACKET_LENGTH];
byte JJ, MM, AA, HH, MN, SS, numSem;
bool Flag = true;
int state = radio.receive(byteArr, 0);
if (state == RADIOLIB_ERR_NONE)
{
int len = radio.getPacketLength();
Serial.printf("RECEIVED [%2d] : ", len);
for (int i = 0; i < len; i++)
Serial.printf("%02X ", byteArr[i]);
Serial.println("");
switch(len)
{
case 63: // Msg transfert sonde / connect
TxByteArr[2] = byteArr[2], TxByteArr[3] = byteArr[3], TxByteArr[4] = 0x01,
TxByteArr[5] = 0x01, TxByteArr[6] = 0x17, TxByteArr[7] = 0x00;
if(Flag)
{
if(byteArr[0] == 0x7E)
{
delay(500);
state = radio.transmit(TxByteArr, 7);
if (state == RADIOLIB_ERR_NONE)
{
Serial.println(F("[SX1262] Packet transmitted successfully!"));
for (int i = 0; i < 7; i++)
Serial.printf("%02X ", TxByteArr[i]);
Serial.println("");
} else if (state == RADIOLIB_ERR_PACKET_TOO_LONG)
{
Serial.println(F("[SX1262] Packet too long!"));
} else if (state == RADIOLIB_ERR_TX_TIMEOUT)
{
Serial.println(F("[SX1262] Timed out while transmitting!"));
} else
{
Serial.println(F("[SX1262] Failed to transmit packet, code "));
Serial.println(state);
}
delay(2000);
state = radio.transmit(Tx2ByteArr, 10);
if (state == RADIOLIB_ERR_NONE)
{
Serial.println(F("[SX1262] Packet transmitted successfully!"));
for (int i = 0; i < 10; i++)
Serial.printf("%02X ", TxByteArr[i]);
Serial.println("");
} else if (state == RADIOLIB_ERR_PACKET_TOO_LONG)
{
Serial.println(F("[SX1262] Packet too long!"));
} else if (state == RADIOLIB_ERR_TX_TIMEOUT)
{
Serial.println(F("[SX1262] Timed out while transmitting!"));
} else
{
Serial.println(F("[SX1262] Failed to transmit packet, code "));
Serial.println(state);
}
}
}
break;
case 15: // Msg chaudière vers sonde Ext
AA = byteArr[7], MM = byteArr[8], JJ = byteArr[9],
HH = byteArr[10], MN = byteArr[11], SS = byteArr[12];
packSize = "Size: ";
packSize += String(len,DEC);
show_DateTime = "Date: " + String(JJ,HEX)+ "/" + String(MM,HEX)+ "/" + String(AA,HEX); //
show_DateTime += " " + String(HH,HEX)+ ":" + String(MN,HEX)+ ":" + String(SS,HEX); //
break;
case 17: // Msg chaudière vers sonde Int
valInt = byteArr[16];
valInt = valInt / 10;
packSize = "Size: ";
packSize += String(len,DEC);
packet2 = "Temp Int: " + String(valInt,1); // T°C Interne
break;
case 23: // Msg Sonde Int vers chaudière
valInt = byteArr[16];
valInt = valInt / 10;
valCons= byteArr[18];
valCons= valCons / 10;
numSem = byteArr[20];
packSize = "Size: ";
packSize += String(len,DEC);
packet1 = "Consigne " + String(valCons,1) + " Int " + String(valInt,1); // T°C Externe
break;
case 49: // Msg chaudière vers sonde Int
valExt = byteArr[8];
valExt = valExt / 10;
valInt = byteArr[20];
valInt = valInt / 10;
valCons= byteArr[22];
valCons= valCons / 10;
AA = byteArr[11], MM = byteArr[12], JJ = byteArr[13],
HH = byteArr[14], MN = byteArr[15], SS = byteArr[16];
packSize = "Size: ";
packSize += String(len,DEC);
packet1 = "Consigne " + String(valCons,1) + " Int " + String(valInt,1); // T°C Externe
packet2 = "Temp Ext: " + String(valExt,1); // T°C Externe
show_DateTime = "Date: " + String(JJ,HEX)+ "/" + String(MM,HEX)+ "/" + String(AA,HEX); //
show_DateTime += " " + String(HH,HEX)+ ":" + String(MN,HEX)+ ":" + String(SS,HEX); //
break;
default:
break;
}
factory_display.drawString(0, 0, show_DateTime);
factory_display.drawString(0, 10, packet1);
factory_display.drawString(0, 20, packet2);
factory_display.drawString(0, 35, packSize);
factory_display.drawString(0, 50, send_num);
factory_display.display();
delay(10);
factory_display.clear();
}
}
Code envoyé sur Github (fork de @Burn )
Je vais maintenant travailler sur un code « factorisé ».
Super, merci !
J’essaie de reprendre ça en fin de journée, avec un peu de chance on peut commencer 2024 avec une solution qui fonctionne !
Je possède une chaudière Frisquet + frisquet connect + sonde extérieure.
Si je peux aider , je suis pas très en code , mais je sais souder.
Auriez-vous une liste de matos , pour faire les test ?
Salut Didier,
Pas besoin de souder quoi que ce soit, (en tout cas pour le moment) il faut juste un Heltec LoRa v3 commandable sur les liens donnés plus haut et en suivant les instructions de mon git (lien plus haut également) ou celui de @FabAng tu devrait recevoir les trames directement dans Home assistant.
Mais si cela te semble compliqué on devrait déjà pouvoir bien avancer avec les infos de @Magfel (Un grand merci au passage) et je m’engage à faire un tuto pas à pas une fois que nous aurons une solution un peu plus clé en main !
Ok pas de soucis, je commande le Heltec LoRa v3 .
Je reviens dès réception
Salut @Burn ,
j’ai également commencé de répertorier des éléments pour une procédure « clé en main » mais pour moi je vois deux approches différentes à l’heure actuel:
Première approche:
Lien RF avec Heltec LoRa V3
Envoi des trames brute via mqtt à un code RUST
Traitement / déchiffrement des trames via le code RUST envoi via MQTT à HA.
et inversement pour envoyer des ordres
HA > MQTT > RUST > MQTT > Heltec > Chaudière
Seconde approche:
Gérer les trames directement sur le Heltec et dialogue en MQTT avec HA.
Si je comprend bien tu serais plus sur l seconde approche ?
Salut @unknown
Sachant qu’il n’y a pas de cryptage et qu’il suffit juste de « transformer » le code hexa en décimal puis de récupérer la valeur je préfère en effet la seconde option, je ne pense pas que cela demande beaucoup de ressource, mais encore une fois je ne suis pas dev de base. Peut être que je me trompe.
Même avis que @Burn
c’est un peu à ça que servent les microcontrôleurs. Et ceux d’aujourd’hui ont beaucoup de puissance…
Je suis aussi de votre avis pour moi le plus simple est de tout mettre sur l’esp32. A voir si il est possible de faire un code assez court pour que tout passe mais effectivement je pense que c’est faisable.
D’après la première série de trames sur le google sheet, je pense que l’on peut en déduire que la formule pour calculer la valeur de la consigne à envoyer en fonction de la T° désirée.
Consigne=(ConsigneEnDegrés-5) * 10
(19.5-5)*10 = 145 (0x91)
(19-5)*10 = 140 (0x8C)
L’octet suivant correspond à la T° réduite (17°C) chez moi, soit 0x78 avec le même calcul.
Bonsoir, la partie contenant les données a déjà été décodée je pense, il y avait quelques notes dans le code de je ne sais plus qui…
4 4 1 T°C 2 1 Lundi Mardi Mercredi Jeudi Vendredi Samedi Dimanche
a1540018 a1540018 30 aa9623 0521 00 03e0ffffffff 00e0ffffff7f 00e0ffffff7f 00e0ffffff7f 00e0ffffff7f 00e0ffffffff 03e0ffffffff
T°C: 0=50=5.0°C, FF=255+50=30.5°C
programmation hebdomadaire: 48bits par jour => 1 bit=30mn
Mince, j’ai perdu du temps pour rien je n’avais pas vu.
On devrait avoir un endroit (mis à jour régulièrement) pour stocker les infos de la trames décodées et restantes à décoder, non ?
Sauf si tout est déjà décodé …
Simplification du code en cours.
Nouveau code publié ce matin avec fonction publishToMQTT() pour alléger…
Appliquée au traitement de la trame 63 octets.
A appliquer à la trame 23 octets (ce soir).
Jai fait une PR de formattage pur, j’ai d’autres modifications dans mon code que je vais soumettre plus tard car le formattage impact beaucoup sur le diff
Quel IDE / deploiement utilisez-vous ?
Je suis sous Arduino IDE, et je dois à chaque fois créer un fichier .ino avec une copie du fichier .cpp présent sur vos dépôts. J’imagine qu’il y a une manière plus simple de procéder non ?