Pilotage Chaudière Frisquet ECO Radio System Visio

Grosse nouvelle aujourd’hui !

Après m’être battu avec plusieurs libs rust de parsing binaire (nom) pour me rendre compte après avoir implémenté le parseur que celui-ci n’était pas réversible (donc pas possible d’encoder une valeur u_u… - raison pour laquelle je ne suis pas parti sur kaitai struct :confused: ), j’ai réussi à utiliser deku qui permet de faire l’encoding et le decoding d’un message.

Et donc… j’ai réussi une association ! Sans paramétrage particulier nécessitant des clés SDR ou autre. De la même façon que ferait la vraie sonde extérieure :tada:

J’ai fait un programme en rust donc, qui se contente de « reproduire » le dialogue de la chaudière, mais à partir de trames que je génère de « zero »

            // metadata = le header présent dans chaque requete, là, je réutilise les metadata de l'association, par "flemme"
            sendData(
                cli, // le client MQTT
                32, // from
                128, // to
                metadata.request_id, // request_id présent dans la trame de la chaudière
                metadata.req_or_answer + 0x80, // +0x80 en cas de réponse
                metadata.msg_type, // le type du message en provenance de la chaudière
                SondePayload::SondeTemperatureMessage { 
                    data: [156, 84, 0, 4, 160, 41, 0, 1,2], // des données qui semblent fixes
                    temperature: 130 // la température exterieure, * 10 
                }
            );

Et au niveau des logs :

send: FrisquetMetadata { length: 17, to_addr: 128, from_addr: 32, request_id: 3612, req_or_answer: 1, msg_type: 23 }, SondeTemperatureMessage { data: [156, 84, 0, 4, 160, 41, 0, 1, 2], temperature: 120 }, payload: "1180200e1c01179c540004a0290001020078"
Received: FrisquetMetadata { length: 15, to_addr: 32, from_addr: 128, request_id: 3612, req_or_answer: 129, msg_type: 23 } data: ChaudiereSondeResponseMessage { unknown_start: 8, year: 35, month: 4, day: 37, hour: 33, minute: 34, second: 68, data: [8, 2] }

Et pour l’exemple, le codec deku des messages de la sonde de temperature ressemble à ça:

#[derive(Debug, PartialEq, DekuRead, DekuWrite)]
#[deku(ctx = "length: u8", id = "length")]
pub enum SondePayload {
    #[deku(id = "17")]
    SondeTemperatureMessage {
        data: [u8; 9],
        #[deku(endian = "big")]
        temperature: i16,
    },
    #[deku(id_pat = "_")]
    SondeUnknownMessage {
        #[deku(count = "length - 6")]
        data: Vec<u8>,
    },
}

J’ai donc testé sur ma chaudière et bingo, j’ai maintenant une sonde exterieure, et la température varie vite par chez moi :grimacing:


Je vais continuer de tester la stabilité et des essais en cas d’échec du programme type: est-ce que je perds le chauffage si la chaudière ne reçoit plus les informations de sonde externe ?

A+

5 « J'aime »