Pilotage Chaudière Frisquet ECO Radio System Visio

Hello,

La période de chauffage a commencé et à ma recherche d’intégration de ma Frisquet Visio Radio dans Homeassistant je suis tombé finalement sur ce fil de discussion.

Un super travail de @mgre (et autres probablement) et un grand merci pour le partage!

Comme j’avais un module radio similaire (et quelques petites expériences) à ma dispo, j’avais commence à mieux comprendre ce projet. Voici un petit résume de mes tests, pour ma documentation, mais aussi pour partager et faire vivre le projet intéressant!

  • RF69 (équivalent SX1231) & ESP32
    • Adafruit Radio FeatherWing - RFM69HCW 900MHz - RadioFruit (green dot)
    • Adafruit HUZZAH32 – ESP32 Feather Board
    • à ma dispo, mais aussi plus facile à commander que le RF63
    • avec une libraire Arduino RadioHead ou son clone Adafruit
    • configuration après datasheet avec RadioHead
      • Frequency 868.96MHz
      • FSK, BitRate 25kbps, Frequency Shift 50kHz, Bandwidth 166kHz
      • SyncWord, CRC
      • pas des Manchester, Data Whitening, Address Filtering
      • Promiscuous mode
  • Tests Rx et Tx basées sur le repo sx1211-arduino de mgre
    • remplacer SX1211 par le RF69
    • trouver le signal de la Frisquet avec gqrx fréquence 868.96MHz (pour moi) et confirmer le Frequency Shift du FSK 50kHz
    • analyse et confirmer la Bitrate 25kbps avec Audacity
    • capture avec YardStick One (chip CC1101) avec rfcat en Rx/Tx
    • simuler et envoyer des messages le rtl_433 de mgre peut décoder en protocole Frisquet pour confirmation
    • écoute trafic Frisquet Radio Visio chaudière ↔ satellite
  • Radio RF69 avec ESP32 et MQTT avec mgre frisquet-eco-radio-esp-firmware
    • envoyer des topics MQTT frisquet/command avec mosquitto
      • mettre le RF69/ESP32 en modes LISTEN/RECEIVE
      • plus tard envoyer les commandes avec des payloads depuis HomeAssistant ou simplement mosquitto pour simuler une sonde extérieure ou un satellite Visio supplémentaire
  • Définition des data structures pour décoder et encoder
    • avec le kaitai frisquet.ksy de mgre
    • kaitai web ide pour vérifier le schéma avec des payloads
    • visualisation en Graphviz dot (généré par kaitai-struct-compiler)
    • premières tests en Rust avec deku, mais après…
    • conversion en Python Construct
      • kaitai-struct-compiler peut générer des définitions pour Python Construct
      • peut faire parse et build, alors décoder et générer des payloads
      • tout comme deku en Rust, avec l’avantage que le HomeAsssistant tourne aussi en Python
  • Homeassistant HA
    • création des sensors MQTT
    • afficher les entities sensors sur les Dashboards
      • messages payload MQTT
    • logger les sondes dans une InfluxDB attaché au HA
    • création d’une app PyScript avec JupyterLab HA
      • avec triggers sur les sondes MQTT
      • décodage avec le schéma Python Construct
      • création des sensors pour les valeurs décodés par Python Construct
        • pour l’instant Température et Consigne
    • Visualisation des données des sensors HA InfluxDB avec Grafana
    • Notebooks Python JupyterLab
      • connexion à InfluxDB et récupérer les valeurs des sensors HA enregistrées
        • analyses des payloads pour comprendre les messages
  • Prochaines étapes
    • analyser et mieux comprendre les messages Frisquet Visio loggé dans InfluxDB
    • comprendre les payloads sur le topic MQTT frisquet/command à envoyer vers le ESP32/RF69 pour se faire passer comme une sonde extérieure ou un satellite, comment les attacher au réseau Frisquet Visio sans perturber la chaudière :wink:
      @mgre et @jnilo semblent d’avoir collectionné des messages?
    • utiliser un capteur HA pour la sonde extérieure et ajuster la température, passer en mode jour/nuit/absence?
    • utiliser le satellite simulé dans un thermostat HA?


image

3 « J'aime »

Hello !
Wahou trop bien ce que tu as fait ! J’avais laissé suffisament de choses derrière moi ! J’ai acheté récemment un Lora-32 v2 (avec un SX1278 dedans) et je me suis rendu compte qu’on pouvait tout programmer ou presque, et donc capter des protocoles non prévus initialement.

J’ai aussi vu qu’on pourrait utiliser la même puce que le flipper zero, le CC1101.

Concernant mes progrès, j’ai toujours de soucis de plantage au bout de plusieurs jours en écoute. Je soupçonne que ça vient du SX1211, mais rien de sur, il faut que j’arrive à gérer le reset via la pin ad-hoc.

J’ai aussi fait une bêtise en faisant la conversion ESP8266 → ESP-32, avec la bufferisation avant de vider la FIFO du sx1211

Start transmission when the number of bytes in FIFO is greater than or equal to the threshold set by MCParam_Fifo_thresh parameter (Cf section 5.2.2.3)

Si la transmission va plus vite que le remplissage de la FIFO, on se retrouve à envoyer des octets aléatoires. Et lorsque j’ai porté le code vers le ESP-32, j’ai testé directement avec une association de sonde exterieur, qui n’a évidemment pas fonctionné, et depuis, je n’arrive plus à associer une sonde exterieure fictive.
Du coup, je ne sais pas si c’est mon code qui a changé et que je n’arrive plus à faire fonctionner, ou si c’est parce que j’ai laissé la chaudière pendant 1 mois sans sonde exterieur avec l’erreur de « Sonde exterieure défaillante » ou autre, mais globalement, quand je tente une association de sonde exterieure, ma chaudière répond correctement, puis à la fin de la conversation, ne répond jamais la trame finale…

N’ayant pas spécialement envie de griller un deuxieme panneau de chaudière (le premier fonctionne mais ne permet plus de mettre une sonde exterieure custom… Peut-être une vraie :man_shrugging: ), j’ai malgré tout trouvé à un bon prix sur lbc un panneau de chaudière ancien, mais il faut que je me motive à le brancher et retester tout ça.
En avril, il me manquait aussi un deuxieme RFM63 pour faire des tests de transmissions entre deux sources que je maitrise pour vérifier que la trame envoyée est égale à la trame recue. J’ai désormais les deux.

@dgeppert, je connaissais pas python construct, ca a l’air efficace, après, j’ai pas mal de code en rust qu’il faudrait que je partage sur un github, pour que tu puisses voir par rapport à l’association de chaudière.

Avec @jnilo, on avait commencé à bosser sur le protocole frisquet connect, mais rapidement, et la taille des trames est vraiment énorme par rapport à celle du satellite ou de la sonde (de mémoire, il envoie 3 trames de 63 octets)

1 « J'aime »

Hello @mgre,

alors je sent de la motivation, on va bien faire avancer le sujet :wink:

concernant ton problème panneau, est-ce que t’as déjà essayé de supprimer la sonde extérieure après le menu avancé selon le guide de maintenance SAV, ou de faire un reset valeurs d’usine (juste pour les paramètres de réglage)?

oui je serais bien intéresse de la méthode ajout de la sonde! faudrait mettre la chaudière en mode ajout ou simplement commence à envoyer avec un id 0x09 pour un satellite ou 0x20 pour une sonde? est-ce qu’il y a un protocole d’échange avec des réponses spécifiques? un bout de code serait probablement assez claire :wink: mais avant de teinter en période de chauffage qui commence je préfère de bien comprendre ou savoir faire des reset!

je crois je vais aussi commander un deuxième chip radio pour simuler des échanges, pas mal ce LoRa Haltec!

pas sûr le protocole Connect serait vraiment utile, assez compliqué probablement avec quelles fonctionnalités en plus. une fois le HA sait capter et envoyer des messages…

@+

Je t’avoue que j’ai un peu abandonné en avril quand il fallait brancher les choses dans HA, parce que j’ai un peu de mal avec le YAML et je trouve pas que la doc soit très claire sur où précisement mettre les choses…

Yes, j’ai essayé d’après ma chaudière la sonde exterieure n’existe plus. Je n’ai pas vraiment de certitude, juste que j’ai réussi un jour et que désormais, ca ne fonctionne plus :sweat:
Concernant le reset aux valeurs d’usine, la chaudière n’oublie pas les appareils connectés ni les circuits, juste les configurations associées (genre les coeffs de chauffe, etc.). Par exemple, l’historique des alertes est toujours rempli…

Alors oui, carrement, quand tu mets les appareils en mode association, ils se mettent sur le réseau ffffffff pour s’echanger l’id de réseau, puis ils changent tous les deux leur identifiant réseau et continue avec une trame d’initialisation (similaire à l’allumage de l’appareil) puis une trame similaire à celle du fonctionnement standard. Le problème est que ma chaudière ne répond jamais à cette conversation alors qu’elle devrait répondre globalement le même genre de trame que pour les satellites (sonde_response si tu as mes fichiers kaitaistruct)

Je vais anonymiser mon code rust pour éviter de partager mes identifiants de chaudière, on sait jamais :sweat_smile: (même si tout est lisible et peut-être hyper facilement sniffé / modifié par des personnes malfaisantes)

Un des interets de ce protocole est qu’on peut continuer d’utiliser les satellites pour leur « fiabilité » (jamais eu un plantage chez moi depuis 5 ans, ca marche) et intervenir sur les réglages de manière externe. Remplacer le satellite est un challenge un peu plus grand car 20 minutes sans envoyer une info met la chaudière en défaut et elle arrête de chauffer (y compris le horsgel…). L’autre problème est une température faussée (parce que le capteur n’envoie pas la valeur par exemple) et on a la boucle de feedback qui ne se fait plus, la chaudière va se mettre à fond pour chauffer sans constater d’effet… Au prix du gaz aujourd’hui. ca peut faire vite mal… Faut avoir confiance dans son installation :sweat_smile:

Ca fait plaisir de voir ta progression, je vais essayer de te passer un max de chose pour t’éviter de tout redécouvrir.
J’essaye de te pousser le code rust ce soir :wink:

re-hello,

oui pour l’ajout des entités dans HA j n’avais pas trop compris non plus, mais je suis débutant.

la façon je trouve encore assez facile c’est apec PyScript: peut réagir avec des triggers sur les sujets MQTT, décoder et mettre à jour ses entités (voici juste des bouts de décodage Python Construct très simple, sans mettre toute la structure Frisquet) :

dans config/configuration.yaml:

pyscript:
  allow_all_imports: true
  hass_is_global: true
  apps:
    frisquet:
      - frisquet_sensor_temperature: -1
        unit_of_measurement: "°C"
      - frisquet_sensor_consigne: -1
        unit_of_measurement: "°C"

après par ex dans un fichier config/pyscript/apps/frisquet/__init__.py

import construct as cstruct
import ast

log.debug(f"{pyscript.app_config=}")

for inst in pyscript.app_config:
  log.debug(f"pyscript.app_config {inst=}")

pyscript.frisquet_sensor_temperature=float("NAN")
pyscript.frisquet_sensor_temperature.unit_of_measurement="°C"

pyscript.frisquet_sensor_consigne=float("NAN")
pyscript.frisquet_sensor_consigne.unit_of_measurement="°C"

pyscript.frisquet_mqtt_command_payload_type="NaN"

# -------------------------------------------------------------------------------------------------

@mqtt_trigger('frisquet/command')
#def frisquet_mqtt_command_trigger(topic):
def frisquet_mqtt_command_trigger(**kwargs):
    log.debug(f"frisquet_mqtt_command_trigger got triggered with {kwargs=}")
 
    payload=ast.literal_eval(kwargs['payload']) #
    pyscript.frisquet_mqtt_command_payload_type=payload['type']

# -------------------------------------------------------------------------------------------------

Frisquet_SetTemperature = cstruct.Struct(

    "year"   / cstruct.Int8ub, # u1 
    "month"  / cstruct.Int8ub, # u1
    "day"    / cstruct.Int8ub, # u1
    "hour"   / cstruct.Int8ub, # u1
    "minute" / cstruct.Int8ub, # u1
    "second" / cstruct.Int8ub, # u1

)

Frisquet_SetTemperatureResponse = cstruct.Struct(

    "data"              / cstruct.Array( 5, cstruct.Int8ub ),   # array of 5
   
    "temperature"       / cstruct.Int16ul,                      # 2 bytes u2le
    "consigne"          / cstruct.Int16ul,                      # 2 bytes u2le

    "modes"             / cstruct.FlagsEnum(cstruct.Byte, 
            unknown_mode1 = 0+1, # 9:0.3b b3
            hors_gel      = 3+1, # 9:3.1b BitsType1(BigBitEndian)
            unknown_mode2 = 4+1, # 9:4.2b b2
            derogation    = 6+1, # 9:6.1b BitsType1(BigBitEndian)
            soleil        = 7+1, # 9:7.1b BitsType1(BigBitEndian)
    ),
    
    "unknown_mode3"     / cstruct.Int16ul,                      # 2 bytes u2le

)

Frisquet_Payload = cstruct.Struct(

    "length"            / cstruct.Int8ub, # u1 
    "to_from"           / cstruct.Int8ub, # u1 
    "from_to"           / cstruct.Int8ub, # u1 
    "unknown1"          / cstruct.Int8ub, # u1 
    "request_id"        / cstruct.Int8ub, # u1 
    "reqOrAnswer"       / cstruct.Int8ub, # u1 
    "msg_type"          / cstruct.Int8ub, # u1 
    "static_part"       / cstruct.Array( 5, cstruct.Int8ub ), # array of 5 ints or variable?

    #"payload_data_size" / cstruct.Int8ub, # u1, length - 11 <--- ToDo

    "payload_data"      / cstruct.Switch(cstruct.this.length, 
    {
        19 : Frisquet_SetTemperature,           # 49=0x31 , 0x49=73  - 0x0f 15 -> 0x13 19 includes 4 header bytes
        23 : Frisquet_SetTemperatureResponse,   # 23=0x17 , 0x23=35  - 0x13 19 -> 0x17 23 includes 4 header bytes
        # _  : Frisquet_SetTemperature,
    },),

)

# ---------------------------------------------------------

def Frisquet_Payload_Decode(payload):

    # for calling parse need format b'\x01\x02\x03\x04\x05\x82\x00\x01\x00\x08\x01\x00'

    len = payload[0] 
    ids = [0x17, 0x13]
    try:
        if len in ids:
            
            f_p = Frisquet_Payload.parse(payload)
            
            if len == 0x17: # 23
                temperature = f_p['payload_data']['temperature']/10.
                consigne    = f_p['payload_data']['consigne']/10.
                pyscript.frisquet_sensor_temperature = f'{temperature:3.1f}'
                pyscript.frisquet_sensor_consigne    = f'{consigne:3.1f}'
            elif len == 0x13: # 19
                year        = f_p['payload_data']['year']
                month       = f_p['payload_data']['month']
                day         = f_p['payload_data']['day']
                hour        = f_p['payload_data']['hour']
                minute      = f_p['payload_data']['minute']
                second      = f_p['payload_data']['second']
        else:
            #log.debug(f"{len=} {hex(len)=} not yet decoded : {bytes.hex(payload)}")
            pass

    except cstruct.StreamError as err:
        log.debug(f"StreamError {err=}, {type(err)=}")
    except Exception as err:
        log.debug(f"Unexpected {err=}, {type(err)=}")
        raise

# -------------------------------------------------------------------------------------------------

@mqtt_trigger('frisquet/receive')
#def frisquet_mqtt_receive_trigger(topic):
def frisquet_mqtt_receive_trigger(**kwargs):
    log.debug(f"frisquet_mqtt_receive_trigger got triggered with {kwargs=}") 

    payload=ast.literal_eval(kwargs['payload'])
    # frisquet/receive {"data":"0F0880696C81030C050A00002311042144330806"}    
    if (payload['data']):
        p=bytes.fromhex(payload['data'])
        Frisquet_Payload_Decode(p) 

# -------------------------------------------------------------------------------------------------

après créer des cards dans le dashboard sur les entites pyscript.*

je dois dire que je suis assez fan de PyScript (découvré il y a deux jours). Quand on modifié un fichier (soit en vi ou avec des apps HA JupyterLab ou VScode, attention faut bien choisir le kernel Python de PyScript) c’est prise en compte en directe (il compris des entités), les logs dans config/home-assistant.log

juste pour donner une idée…

@dgeppert J’ai posté mon code rust ici

L’association est faite ici:

Je vais regarder PyScript et Python construct, même si j’ai pas mal de code en rust qui me convenait assez bien (et qui est un bac à sable pour apprendre le rust :sweat_smile: J’ai pas specialement envie d’investir du temps dans python)

J’ai aussi mis à jour sx1211-arduino avec les dernières modifications (notamment le FIFO threshold dont je parlais hier)

Hello, un grand merci @mgre! ça va bien m’aider.

non je n’ai pas voulu de convaincre de passer coté Python, juste donner un petit example pour vite intégrer dans le HA. par contre ton git rust me donne très envie de me mettre un peu sur Rust, une petite application déjà fonctionnelle et un cas d’utilisation concret., parfait pour apprendre. encore un grand merci pour le partage @mgre

Bonjour @mgre et @dgeppert ,

comme d’autres sur ce forum je suis un possesseur d’une chaudière Frisquet (avec thermostat Radio System Visio) et je suis passionné de domotique depuis plusieurs années déjà. J’ai tenté pas mal de solutions pour domotiser ma chaudière (contact sec avec thermostat logiciel, thermostat matériel type Netatmo) mais à chaque fois je n’étais pas satisfait par le manque de finesse du pilotage (température de départ par exemple) comparé au thermostat de Frisquet. J’ai fini par y revenir. Je m’étais renseigné à propos de Frisquet Connect mais le manque d’ouverture (et donc d’intégration possible avec Home Assistant) m’a démotivé, je n’ai donc jamais sauté le pas.

Du coup, c’est avec le plus grand intérêt que je suis vos conversations depuis que j’ai découvert ce thread dans l’espoir qu’une solution apparaisse enfin pour la domotisation d’un chaudière Frisquet. Au point que j’ai créé un compte sur ce forum pour poster ce message et y contribuer.

La piste que vous envisagez (l’émulation du thermostat Frisquet) me semble super intéressante et prometteuse. Elle me rappelle fortement le travail de Kainhofer qui a été résumé et traduit en français par Antoine Grall sur son blog. Connaissiez vous leur travail ? Certes ils ont réussi à décoder le thermostat Eco Radio System (la version antérieur au Visio) dont une des différences semble être qu’un chiffrement a été mis en place sur le Visio. Au delà de ce chiffrement je me demande dans quelle mesure les trames de communication ont été changées entre les deux protocoles et je me demandais si vous ne pourriez pas vous inspirer de ce travail pour confirmer vos pistes.

Je suis intéressé à participer à ce projet et si je peux vous aider à tester ou quoi que ce soit, ce serait avec plaisir. J’ai cru comprendre que la partie intégration dans Home Assistant n’est pas votre fort ? C’est certainement la partie sur laquelle je peux peut être vous aider le plus efficacement (je ne m’y connais pas trop en électrique, beaucoup plus en informatique). Dites moi si vous pensez que ca peut être utile.

En tout cas merci pour votre travail qui redonne espoir à pas mal d’utilisateur de chaudière Frisquet il semble !

esseki

Je m’excuse je ne sais pas comment partager des liens sur ce forum, je peux peut être vous envoyer les sites cités comme sources en MP si vous le souhaitez.

Hello @esseki ,

Merci pour ton message!

Oui, je suis aussi parti de là (c’est dans mon premier post :stuck_out_tongue: ). Ma première crainte était que ce soit vraiment crypté, mais en réalité, il n’y a pas le moindre cryptage, tout passe en clair. En revanche, il y a une forme d’isolation avec une echange d’identifiant de réseau (la fameuse phase d’association).
Le protocole de visio est plus compliqué que celui de radio, et les deux ne se ressemble pas trop.
Une grosse part de responsabilité est donnée au satellite dans la version « radio » qui calcule la différence de temperature et donne une consigne de puissance à la chaudière (comme si le PID était dans le satellite), la version visio ne fait que sonde de temperature et temperature de consigne (avec changement de mode), donc le PID est dans la chaudière.

En fait, il faut réussir à trouver un appareil pour pouvoir experimenter, et là dessus, la piste de @dgeppert est vraiment intéressante, j’ai aussi commandé un lora-32-v2 (17€ sur ali, vraiment bon tarif) avec un chipset proche du rfm95 et aussi tenter un portage.

Une fois qu’on aura le module radio - mqtt fiable, les choses devraient avancer plus vite, mais mes tests prennent littéralement 3 semaines à vérifier… C’est la raison pour laquelle je me dis que changer de chipset est une bonne idée car des drivers plus stable que le mien existent dans radiolib ou radiohead.

Oui, je suis aussi parti de là (c’est dans mon premier post :stuck_out_tongue: )

Oups… Est ce que j’ai lu trop vite … ou carrément sauté les premiers posts comme le thread était vraiment long :wink:

Le protocole de visio est plus compliqué que celui de radio, et les deux ne se ressemble pas trop.
Une grosse part de responsabilité est donnée au satellite dans la version « radio » qui calcule la différence de temperature et donne une consigne de puissance à la chaudière (comme si le PID était dans le satellite), la version visio ne fait que sonde de temperature et temperature de consigne (avec changement de mode), donc le PID est dans la chaudière.

En effet ça n’a rien à voir ! Je ne pensais pas qu’entre les deux, le changement serait aussi conséquent.

En fait, il faut réussir à trouver un appareil pour pouvoir experimenter, et là dessus, la piste de @dgeppert est vraiment intéressante, j’ai aussi commandé un lora-32-v2 (17€ sur ali, vraiment bon tarif) avec un chipset proche du rfm95 et aussi tenter un portage.

Une autre aide que je peux apporter et que j’ai oublié de mentionner c’est financer du matos si nécessaire. Comme je l’ai dit, l’électronique c’est pas mon fort mais comme j’ai à coeur de faire avancer ce projet, je peux passer une commande de matos et le faire livrer chez vous si vous me dites ce dont vous avez besoin (et que le prix reste raisonnable).

1 « J'aime »

Hello,

aujourd’hui j’ai reçu un Heltec Lora v3 avec un ESP32-S3 et SX1262, par ex chez Amazon pour 32€. Le modul est supporté par Arduino et PlatformIO, la puce radio par Radiolib et la capture des trames Frisquet fonctionne sans problème.

#include <Arduino.h>
#include <RadioLib.h>

SX1262 radio = new Module(SS, DIO0, RST_LoRa, BUSY_LoRa); 

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);
    int network_id[] = {0x12, 0x34, 0x45, 0x67};
    state = radio.setSyncWord(network_id, sizeof(network_id));
}

void loop() {
    byte byteArr[RADIOLIB_SX126X_MAX_PACKET_LENGTH];
    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("");
    }
}
RECEIVED [23] : 80 08 69 E0 01 17 A0 33 00 01 A0 2F 00 04 08 00 D0 00 CD 00 01 01 C3 
RECEIVED [ 9] : 08 80 69 E0 81 17 02 01 AC 
RECEIVED [10] : 80 08 69 E4 01 03 A0 29 00 06 
RECEIVED [19] : 08 80 69 E4 81 03 0C 05 0A 00 00 23 11 16 22 41 25 08 04 

ça serait pas compliqué de l’intégrer dans le projet de @mgre, peut-être ça pourrait intéresser des autres à ce lancer?

Haha j’ai justement un Heltec Lora v3 sur mon bureau qui traine depuis 4 mois, car je m’étais trompé en commandant j’avais besoin d’un v2 explicitement.

Ecoute, ca me parait une super idée, d’autant que le lora v3 est super facile à trouver. Je l’avais eu moins cher sur amazon aussi (25€) et sur ali express, on peut les trouver à encore moins (potentiellement ~15€)

Je suis pas dispo ce week-end, mais je vais m’y interesser la semaine prochaine :smiley:

Trop trop bien ! Merci pour tous tes tests !

Hello,

j’ai aussi testé la transmission avec ce Heltec Lora v3, ça semble bien fonctionner, les trames sont correctement reçus par un RF69 qui décode aussi la chaudière.

Après tous ces heures passé sur ce RF69 le quelle j’ai seulement réussi à faire fonctionner en réception avec RadioHead. La transmission avec cette librairie semble d’avoir des problèmes avec le FIFO, et avec RadioLib en réception il y a aussi 2 bytes en plus après le SyncWord. Bref, c’est bcp mieux avec ce Heltec et RadioLib!

ça serait trop cool si on avancerait, la régulation température de la Frisquet seulement avec le satellite n’est pas trop au point je trouve: la température à peu près stable, mais des longues périodes sans que l’eau chaude circule dans les radiateurs et ça fait une sensation de froid, au moins chez moi. pour ajouter une sonde extérieure il faut acheter la sonde sans fil Visio pour 300€, un ESP32 serait bcp plus raisonnable en terme de prix et ferait bien le même travail :wink:

@+

Hello,

J’ai aussi commencé à expérimenter de mon côté avec un rf69. J’utilise un feather M0 qui n’a pas de support WIFI du coup j’ai ajouté un client serial à frisquet-commander.

@mgre j’ai ouvert une pull request ((je n’ai pas le droit de poster de lien mais elle facilement trouvable, c’est la #1)), il y a pas mal de change car j’ai utilisé cargo fmt mais le principal est la /src/rf.

@dgeppert si tu veux l’utiliser il faut que tu crée un fichier config.yaml

serial_port: "/dev/cu.usbmodem111201"
serial_speed: 115200
network_id: <HEX_ID>

Le client interprète toute ligne encodé en hexa, pour ton programme (pas testé) ça ressemblerait à

Serial.printf("%02X", len);
for (int i = 0; i < len; i++)
    Serial.printf("%02X", byteArr[i]);
Serial.println();

Pour les commandes c’est au format : . Pour les commandes supporter je t’invite a regarder le module serial (/src/rf/serial/mod.rs).

J’ai commencé à implémenter Frisquet Connect, je vous en dit plus bientôt!

très intéressant, impatient à lire la suite! :stuck_out_tongue_winking_eye:

C’est génial ! Ça me fait tellement plaisir de voir toute cette émulation !

J’ai vu ta PR, j’ai l’impression que tu es plus à l’aise en rust que moi :sweat_smile:

J’ai l’impression qu’il y a quelques tests qui sont passés en commentaires, je vais regarder ça dans la semaine (qui devrait faire 2-3j de plus pour passer moins vite). Je vais surement passer un commit de formatage pour y voir plus clair avant.

A+

Pour les adeptes d’enigme dans ce sujet :innocent:
J’ai commence a travailler sur les commandes du mode vacance, mais je ne parviens pas a identifier le format de la data :sweat_smile:
Le format est le suivant:

69906555 est 16/11/2023
bb106556 est 17/11/2023

de906567 est 30/11/2023
30106569 est 01/12/2023
8190656a est 02/12/2023
d310656b est 03/12/2023
2490656d est 04/12/2023
7610656e est 05/12/2023
c790656f est 06/12/2023
19106571 est 07/12/2023
6a906572 est 08/12/2023
bc106573 est 09/12/2023
0d906575 est 10/12/2023
5f106576 est 11/12/2023

0e906592 est 01/01/2024
60106593 est 02/01/2024

ed1065ba est 01/02/2024
93906774 est 01/01/2025 
e5106775 est 02/01/2025

Hello
Super ton travail !
C’est étrange ton problème de date. Car dans le dialogue entre la sonde externe et la chaudère la date apparait en clair de même qu’entre la chaudière et la box Frisquet Connect.
Voici ce à quoi j’étais arrivé lors de mes essais de décodage avec @mgre
Dialogue Sonde ↔ Chaudière

Dialogue Box Connect ↔ Chaudière

Ce serait bizarre que les dates soient programmées autrement dans le mode vacances…
Bonne enquête !
Jacques

Hello !

Pour les dates, tu pourrais tenter avec des dates au milieu de l’année ?

Je me demande si il n’y a pas une histoire d’offset par rapport à une date :stuck_out_tongue: