Pilotage Chaudière Frisquet ECO Radio System Visio

Bonjour à tous,

Super projet que je regarde par curiosité, ma Frisquet étant pré 2012 (je suis l’auteur du sujet relatif au Pilotage Chaudière Frisquet ECO Radio System via ESPHome).

Pour ceux qui ont le module Frisquet Connect, avez-vous essayé de regarder comment il communique avec les serveurs de chez Frisquet ? (Voir le principe ici : How to man-in-the-middle proxy your IOT devices | Robert Heaton)

Si Frisquet a bien fait son boulot et que le Frisquet Connect vérifie l’authenticité du certificat, il y a peu de chance que cela fonctionne mais cela vaut peut-être le coup d’essayer.

1 « J'aime »

Pour le coup, j’ai pas investi dans un frisquet connect, trop cher et pas utile à mon sens car trop fermé.

Hier, j’ai presque fini le driver basique du sx1211/rfm63, il me manque plus que la gestion des interruptions liées à la réception, mais ça ne saurait tarder.
Après on rentre dans la phase écoute en permanence de ce qui circule sur la radio :ok_hand:

À l’occasion, si des gens ont une frisquet connect, ou une sonde extérieure, ça pourrait valoir le coup de participer à l’écoute !

Je vous tiens au courant de mes avancées

Hello,

Petite update. J’ai des bonnes nouvelles :tada:

D’abord, j’ai réussi à lire des données depuis le RFM63 (le clone chinois du SX1211), j’ai pas mal galéré, mais c’était lié à la lib arduino SPI pour nodemcu dont les valeurs de fréquences pour la CLK qui sont complètement fausses (le diviseur donné pour 125Khz génère un signal à +50Mhz, celui pour 8Mhz génère un signal autour de 1Mhz, il me fallait du 500Khz max.).

Par contre, j’ai lu et relu la doc à la recherche d’un mode « sans validation » de l’identifiant de réseau (dans la doc, le SYNC, sur 4 octets). Je pensais que c’était possible, mais ce n’est pas le cas.
Pour référence, les packets sont envoyés dans les airs avec ce format :

Le preamble a toujours la forme de 0xAA ou 0x55 (ca dépend de l’alignement), et le SYNC correspond à un identifiant de réseau qui est filtré par le chipset s’il est différent.

Donc je suis revenu à la SDR, me disant que si je voulais récupérer de la donnée d’un max de chaudière, c’était pas envisageable de demander de souder dans le thermostat.

Et… J’ai réussi à décoder les trames avec rtl_433 \o/

Je suis passé à l’écriture d’un decoder, le CRC me cause des soucis, mais je suis déjà en train de récupérer des trames:

{"time" : "2023-02-22 15:36:18", "model" : "sx1211", "network_id" : "05f114c8", "size" : 23, "to" : 128, "from" : 8, "payload" : "b3e80117a0290015a02f00040800b400dc002500c635ce", "crc" : 10922, "raw_payload" : "(­û", "mic" : 64127}
{"time" : "2023-02-22 15:36:18", "model" : "sx1211", "network_id" : "05f114c8", "size" : 49, "to" : 8, "from" : 128, "payload" : "b3e881172a050a0000230222164012000300b400dc002500c600c604f6000000000000000004f6000000000000000031b2", "crc" : 10922, "raw_payload" : "(­û", "mic" : 35016}
{"time" : "2023-02-22 15:38:11", "model" : "sx1211", "network_id" : "05dc5829", "size" : 23, "to" : 128, "from" : 8, "payload" : "dd240117a0290015a02f00040800be00be000502241f39", "crc" : 10922, "raw_payload" : "(­û", "mic" : 53384}

Je crois que je capte toutes les chaudières frisquet de mon quartier, j’en suis à 5 :sweat_smile:

Pour référence, j’ai commencé à bosser avec rtl_433 -S all -f 868900000 qui va générer des fichiers .cue, et ensuite, on peut les voir avec sigrok en faisant rtl_433 -W out_.sr g007_868.9M_1000k.cu8

Pour le décodeur flex, j’ai utilisé rtl_433 -X 'n=frisquet,m=FSK_PCM,short=38,long=38,reset=4200,tolerance=3' g009_868.9M_1000k.cu8 .

Je vais bientôt publier un fork de rtl_433, si des gens possèdent un frisquet connect et/ou des sondes extérieures, je suis preneur de trames capturées avec un sdr rtl2832 !

3 « J'aime »

J’ai environ 15h de données, et j’ai fait quelques tests hier soir en modifiant des valeurs sur le thermostat, et je commence à trouver des choses intéressantes


C’est très prometteur ! Je ne m’intéresse qu’au message qui permet de modifier les consignes de chauffe, c’est vraiment long car le satellite n’envoie les consignes qu’au bout de ~30s.
Je ne me suis pas encore intéressé à la réponse de la chaudière, mais elle répond avec beaucoup plus de données (23 en envoi vs 46 en réception).

Je vais voir pour packager correctement rtl_433 pour proposer l’intégration à la communauté :smiley:

2 « J'aime »

Chouette taff en tout cas !

Pour ma pars je découvre bitbench. C’est un outils pour analyser des trames ? En gros tu collectés, tu balances en vrac et il te montre ce qui varie ?

Si oui c’est cool !

C’est ça, tu mets les trames dedans, et tu mets le format, hh pour afficher l’octet en Hexa, bbbbbbbb pour le binaire et d en décimal.
C’est un outil qui vient de rtl_433, j’ai trouvé par hasard, mais c’est hyper pratique !

@mgre super taf !!!
Je ne comprend pas la moitié!
Mais si tu as arrives à trouver une solution pour qu’on puisse envoyer une température de commande et la température sonde extérieure à la petite chaudière via rfx433, je suis preneur, je ne sais pas si c’est vraiment ça que tu cherches,
En tout cas je suis le post au cas où ^^ !!
Bravo

Hello !

Merci !
Je connaissais pas le rfx433, mais si je ne dis pas de bêtises, ce sera plutôt un rfx868 car la chaudière frisquet est autour de 868Mhz.

Ca peut effectivement une solution, mais vu le prix et le fait que j’ai déjà mis plus de 100€ dans les devices d’experimentation (satellite + panneau de chaudière), je vais probablement passer mon tour pour l’intégration :sweat_smile:. J’ai acheté le petit device compatible sx1211, pour 10€, une carte esp8266 qui me restait pour 4€, ca fera l’affaire :stuck_out_tongue:

Après, ca doit pas être compliqué à porter dessus, j’imagine qu’il faut « juste » générer les payloads avec le bon format.

Ceci-dit, @Morinus007, tu as une sonde extérieure ? J’ai regardé les modules sur leboncoin, et c’est beaucoup plus rare et l’investissement est autour de 400€, je suis pas forcement prêt :sweat_smile: Par contre, avec un tuner tnt sdr et rtl_433, on peut récupérer facilement les trames radio pour analyse, je suis preneur de beta-testeur !

De mon coté, une fois le protocole décrypté, j’ai l’intention de l’implémenter pour fonctionner avec un RFplayer2 hxxps://myrfplayer.com/

2 « J'aime »

Merci @mgre , j’aurai du m’en douter, que c’était du 868Mhz pour le retour d’info!
J’ai bien une Zwave qui tourne dans ces fréquences mais je ne pourrai rien en faire!! :smiling_face_with_tear:
@Kitof auras plus de chance avec in RFPLAYER2…
Pour la sonde extérieur, je n’ai pas celle de Frisquet, ça coute aussi un bras!
J’ai une station météo sans fil style oregon scientific, avec 3 sondes, dont une à l’extérieur qui me remonte l’info très fréquemment en 433Mhz… ça me paraissait bien de pouvoir donner la température que j’ai sans acheter une autre sonde Frisquet!
Bon en tout cas, je suis ton post, et te félicite encore pour toutes tes recherches !!!

Bon, plein de nouvelles encore:

Primo, j’ai réussi à me faire passer pour une chaudière auprès du satellite :tada:


J’ai « juste » rejoué une trame réponse de ma chaudière en changeant les valeurs qui avaient l’air de correspondre dans la trame requete. J’ai fait deux trois essais-erreurs, et boum !

Deuxio, je galère un peu sur le CRC du chipset, j’ai utilisé un outil qui s’appelle reveng crc pour trouver les valeurs du CRC. En effet, la documentation ne donne que l’algo, mais pas les valeurs initiales.

./reveng -w 16 -s 178008dd500117a0290015a02f00040800b900be00050352fd49 17800819440117a0290015a02f00040800a800aa002401578f80 \
178008ab340117a0290015a02f00040800b300be002502c1f15b \
178008b3140117a0290015a02f00040800b100dc00250352db11  \
178008dd540117a0290015a02f00040800ba00be00050352f307 \
17800819480117a0290015a02f00040800a900aa002401610a01 \
178008ab380117a0290015a02f00040800b400be002502c6f38d \
178008b3180117a0290015a02f00040800b100dc00250352b064 \
178008dd580117a0290015a02f00040800ba00be000503529872 \
178008194c0117a0290015a02f00040800aa00aa00240171167e \
178008ab3c0117a0290015a02f00040800b600be002502c02564 \
178008b31c0117a0290015a02f00040800b100dc0025035266a8 \
178008dd5c0117a0290015a02f00040800ba00be000503506efc \
17800819500117a0290015a02f00040800ac00aa00240176c79a \
178008ab400117a0290015a02f00040800b800be002502bcc31a \
178008b3200117a0290015a02f00040800b100dc00250352b028 \
178008dd600117a0290015a02f00040800ba00be00050352983e \
17800819540117a0290015a02f00040800ab00aa0024016f8b0a \
178008ab440117a0290015a02f00040800b900be002502b60cfd \
178008b3240117a0290015a02f00040800b100dc0025035266e4 \
178008dd640117a0290015a02f00040800bb00be00050352f693 \
17800819580117a0290015a02f00040800ab00aa0024015a8689 \
178008ab480117a0290015a02f00040800ba00be002502ad1c50 \
178008b3280117a0290015a02f00040800b100dc002503520d91 \
178008dd680117a0290015a02f00040800bb00be000503529de6 \
178008195c0117a0290015a02f00040800aa00aa00240151594f \
178008ab500117a0290015a02f00040800bc00be002502a29a70 \
178008b3300117a0290015a02f00040800b100dc00250352db7b \
178008dd700117a0290015a02f00040800bb00be000503524b0c \
17800819640117a0290015a02f00040800ab00aa00240158704b
width=16  poly=0x1021  init=0x236b  refin=false  refout=false  xorout=0x0000  check=0xe06c  residue=0x0000  name=(none)

J’ai mis ces valeurs dans rtl_433, malheureusement, ca ne fonctionne que sur certaines requetes, pas toutes… Je ne sais pas si ça vient de mon implementation un peu foireuse (je fais pas de C d’habitude, j’aime pas manipuler les tableaux d’octets :sweat_smile:)

Du coup, ca me gêne pas pour emettre avec le device idoine, mais pour les implems à base de RFPLAYER, il faudra cracker ça.

Enfin, j’ai commencé à réfléchir au livrable final que j’allais faire. Je pense faire un programme qui parse et interprète le protocole sur une machine linux x86/ARM qui pilote un transceiver (en USB, sur une liaison série, …) pour envoyer et recevoir des informations. L’idée est de limiter la phase d’implémentation sur le device RF à envoyer et recevoir des trames brutes.
J’ai donc commencé à implementer un parseur avec Kaitai Struct pour laisser la porte ouverte aux implémentations dans tous les langages, je connaissais pas, mais c’est vraiment génial :



2 « J'aime »

Bonjour
Impressionant @mgre !
J’ai Frisquet Connect et une sonde extérieure Frisquet sur mon Hydromotrix Visio. J’ai aussi un dongle compatible RTL-SDR que je commence juste à découvrir…
Je veux bien « beta tester » mais j’aurais besoin de guidance :slight_smile:

Trop bien !!

Ca me donne un objectif pour mettre tout ça en forme ! Tu es plutot sur linux ou windows ? Raspberry pi peut-être ?

Plutôt windows au quotidien. J’ai aussi un Minisforum N40 sur lequel je peux monter linux ou raspbian.
Pour l’instant j’ai essayé de tester un dongle NESDR sur Windows + Universal Radio Hacker mais je rame pour trouver le signal Frisquet

Du coup, j’ai l’impression qu’avec un linux, ce sera plus simple, meme si rtl_433 a l’air de se compiler sur windows.

Donc j’ai poussé mon code sur un repository github, avec un commit qui ajoute le support du SX1211. Son objectif est de capturer des trames brutes, sans les décoder.

Les instructions de build sont assez « simple »:

sudo apt-get install libtool libusb-1.0-0-dev librtlsdr-dev rtl-sdr build-essential cmake pkg-config

Puis

git clone git@github.com:mgrenonville/rtl_433.git 
# ou git clone https://github.com/mgrenonville/rtl_433.git si ça ne fonctionne pas
cd rtl_433/
mkdir build
cd build
cmake ..
make

Ensuite, le binaire généré se trouve dans <REPOSITORY rtl_433>/build/src/rtl_433.

Pour ma part, je lance cette commande:

/path/to/rtl_433/build/src/rtl_433  -R 242 -f 868900000  -F json:dump.json   -F log  -v
  • -R 242 : C’est l’identifiant du decodeur dans mon build de rtl_433
  • -f 868900000: C’est la fréquence de la chaudiere
  • -F json:dump.json : Ca va logguer dans le répertoire courant un fichier dump.json

Ensuite, tu peux apporter ton thermostat et lui faire des changements de configuration ou autre, tu devrais voir des lignes apparaitre dans le fichier.

Tu risques de capter plusieurs identifiants de network_id, et aussi pas mal de données foireuses (comme je n’arrive pas à vérifier le checksum, je peux pas filtrer). L’idée est de trouver ton identifiant de chaudière (ie, le network_id) en prenant un satellite et en soufflant sur la sonde de température en haut à droite, le thermostat va se mettre à émettre comme un petit fou.

Une fois que tu as l’identifiant, tu peux filtrer le fichier avec jq 'select(.network_id == "05da2ee2") dump.json. (sudo apt install jq, un super outil pour manipuler le json)

En info interessante, pour la sonde exterieure, ce serait bien de récupérer:

  • des trames de temperature exterieure.
  • des trames d’association
  • des trames d’initialisation

Dans les données dump, je loggue des adresses, j’ai reperé que :

  • 0x80: La chaudière
  • 0x08: Le satellite Z1
  • 0x09: Le satellite Z2

Je soupçonne que le Z3 sera à 0x10, le reste, c’est la découverte !

1 « J'aime »

Hello Mathieu
OK j’ai installé Ubuntu sur mon Minisforum N40 avec ta version de rtl_433. Pas de problème.
Il y a beaucoup de network ID !!! Je vais te faire passer par MP un lien avec les trames collectées pendant 1h (si j’y arrive car de temps à autre j’ai « stack smashing detected » error message qui arrête la collecte, voir plus bas)
Dans mon environnement il y a 4 appareils qui communiquent:
1/ La chaudière (emission/reception)
2/ L’emetteur de la sonde externe (one way j’imagine)
3/ L’emetteur/recepteur de la box Frisquet raccordé à ma box internet par cable mais qui communique en radio avec la chaudière
et enfin 4/ le satellite d’ambiance
Ça fait beaucoup de trafic :slight_smile: Mais l’avantage de Frisquet connect c’est que cela remonte des infos potentiellement utiles qui n’arrivent pas sur le satellite et, en particulier, la consommation de gaz associée au chauffage et à la production d’eau chaude…
Sais-tu si les 4 sources mentionnées plus haut ont un network id identique ou différent (une sorte de mac adresse en quelque sorte) ?
A suivre…


jacques@-N40:~jacques/grenonville$ ../rtl_433/build/src/rtl_433 -R 242 -f868900000 -F json:dump1.json -F log -v
rtl_433 version -128-NOTFOUND branch master at 202302282329 inputs file rtl_tcp RTL-SDR
Use -h for usage help and see https://triq.org/ for documentation.
Trying conf file at "rtl_433.conf"...
Trying conf file at "/home/pascal/.config/rtl_433/rtl_433.conf"...
Trying conf file at "/usr/local/etc/rtl_433/rtl_433.conf"...
Trying conf file at "/etc/rtl_433/rtl_433.conf"...

New defaults active, use "-Y classic -s 250k" if you need the old defaults

Protocols: Registered 1 out of 242 device decoding protocols [ 242 ]
SDR: Found 1 device(s)
SDR: trying device 0: Realtek, RTL2838UHIDIR, SN: 00000001
Found Elonics E4000 tuner
SDR: Using device 0: Realtek, RTL2838UHIDIR, SN: 00000001, "Generic RTL2832U OEM"
Exact sample rate is: 1000000.026491 Hz
SDR: Sample rate set to 1000000 S/s.
Input: Bit detection level set to 0.0 (Auto).
SDR: Tuner gain set to Auto.
Input: Reading samples in async mode...
SDR: Tuned to 868.900MHz.
Allocating 15 zero-copy buffers
Baseband: low pass filter for 1000000 Hz at cutoff 200000 Hz, 5.0 us
*** stack smashing detected ***: terminated
Abandon (core dumped)

Alors je suis sur de rien, mais ce que j’ai observé, c’est que le chipset sx1211 ne peut écouter que sur un seul network_id à la fois. On peut le changer en cours de route, mais pas écouter sur deux network_id en même temps.
Ça me parait peut probable que la chaudière change de network en cours de route car, dans ma compréhension, elle est toujours en écoute et répond dans la seconde. Dans mes données, je vois 99% du temps une réponse. Après, mon setup à un seul thermostat aide pas à invalider l’hypothèse :sweat_smile:

Je vais revoir ma copie pour le stack smashing detected je soupçonne qu’une trame casse tout. Je me dit notamment que je prends la taille du payload pour « argent comptant », et si la valeur dépasse 64, à priori, c’est impossible d’après les specs du mode packet. C’est possible qu’on obtienne un dépassement de stack à ce moment là

A la réflexion il est effectivement logique qu’il n’y ait qu’un seul network ID. Cela serait cohérent avec la phase d’association qui est demandée pour la sonde externe, la box connect et le satellite lors de leur installation. Ce doit donc bien être la chaudière qui assigne le network ID.
Du coup j’ai pensé à un truc très simple pour identifier network id parmi tous ceux que je reçois. Je fais tourner rtl_433 pendant un certain temps (disons 10’) puis j’éteins la chaudière et je cherche l’ID qui a disparu :slight_smile:
Et puisque tu en es à trafiquer rtl_433 (chapeau !) ce serait bien que l’on puisse rajouter un flag qui précise que seules les data relatives à un network id donné soient capturées. Voire même, puisque le programme doit être compilé, un paramètre à modifier directement dans le source du programme. Malheureusement mes connaissances en programmation se sont arrêtées au Fortran et au Basic donc je ne me sens pas trop capable de relever ce challenge :slight_smile:

Pour le coup, j’ai remarqué que le thermostat se met en émission si la température varie beaucoup, donc un coup de seche cheveux ou au dessus d’un radiateur, et il envoie une trame toutes les dix secondes !

J’ai fait un petit fixe sur le code de rtl_433, normalement, je filtre les valeurs aberrantes (taille > 64). J’ai mis à jour le git, tu peux juste faire un git pull origin master et relancer la compilation. Ca devrait moins logguer, car c’est vrai que je trouve beaucoup de choses étrange dans ton dump :smiley:

Autre chose, pour limiter les interférences avec d’autres systèmes, tu peux aussi retirer l’antenne de la SDR, j’ai constaté que meme sans antenne, je capte vraiment bien les signaux de mon systeme, mais moins bien celui des voisins :smiley:

J’avais commencé par faire cela en mettant la SDR entre la chaudière et le récepteur de la sonde extérieure mais bizarrement je ne captais rien. Alors j’ai remis l’antenne… Il aurait peut-être fallu que j’attende davantage…