Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Prochaine révision Les deux révisions suivantes | ||
interface_chauffage_-_local_process_bus_lpb [2017/12/30 19:24] 88.164.131.165 [Hardware] |
interface_chauffage_-_local_process_bus_lpb [2018/04/22 20:43] 88.164.131.165 [Le format de la trame] |
||
---|---|---|---|
Ligne 33: | Ligne 33: | ||
Liaison UART (RS232) 4800 Bauds - 8 bits Data - parity odd - 1 stop bit | Liaison UART (RS232) 4800 Bauds - 8 bits Data - parity odd - 1 stop bit | ||
+ | ==== 1er lecture ==== | ||
+ | |||
+ | Lors de la première lecture, on obtient des trames du type : | ||
+ | <code> | ||
+ | 87 EB FF EF 33 FD FF EB 9C C2 D2 FD F2 F9 FE FF FF FF FE 10 8B 87 F1 EF FF 33 FD FF EB 9B D2 C2 FD F2 0A 9E | ||
+ | 87 EA 00 FF 03 FD FF EB FD D2 FF FD CE FF FF CE 4F FD FF F2 0F FC | ||
+ | 87 E2 00 FF 33 FD FF EB FD D2 FF FD F0 F9 F9 FE FE D5 7B 6F 6F 6F 6F 6F 6F 03 ED FF 14 04 | ||
+ | 87 EF 00 FF 33 FD FF EB FD EA FF FE 04 CD FE 0B 42 | ||
+ | 87 EE 00 FF 33 FD FF EB FD FA FF FD E2 FF F3 2C 0C 81 | ||
+ | </code> | ||
+ | |||
+ | Ces trames débutent toutes par "87" et ne sont pas directement exploitables. Les trames devraient commencer par "78" | ||
+ | Pour cela, il faut inverser tous les bits des données reçues : | ||
+ | <code csharp> | ||
+ | for (int i = 0; i < buffer.Length; i++) | ||
+ | { | ||
+ | byte InvertByte = (byte)~(uint)buffer[i]; | ||
+ | buffer[i] = InvertByte; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Ensuite vous devivriez bien obtenir des trames debutant pour "78" | ||
+ | <code> | ||
+ | 78 11 FF 00 CC 02 00 14 02 05 00 02 1D 00 0F 06 F2 B4 | ||
+ | 78 13 FF 00 FC 02 00 14 02 15 00 02 0A 00 01 1F 00 00 F0 F0 | ||
+ | 78 11 FF 00 CC 02 00 14 02 05 00 02 1D 00 0E C0 F3 6D | ||
+ | 78 10 FF 00 CC 02 00 14 02 15 00 01 FB 00 00 F4 8A 78 14 00 10 CC 02 00 14 A3 3D 2D 02 0D 06 01 00 00 00 01 EF B4 | ||
+ | </code> | ||
+ | |||
+ | ==== Le format de la trame ==== | ||
+ | |||
+ | Exemple : 78 11 FF 00 CC 02 00 14 02 05 00 02 1D 00 0F 06 F2 B4 | ||
+ | * 78 : Magic Byte - Indique le debut de la trame (Toujours 78) | ||
+ | * 11 : Taille - Indique la taille du télégramme sans compter le Magic Byte 0x11 = 0d17 et on a bien 7 octets dans la trame. | ||
+ | * FF : Destination - Adresse de destination du telegramme (0xFF Broadcast à touts les périphériques sur le bus) | ||
+ | * 00 : Expéditeur - Adresse de l'expediteur du telegramme | ||
+ | * CC : Flag d'envoi ou de réception ? | ||
+ | * 02 : inconnu | ||
+ | * 00 : inconnu | ||
+ | * 14 : inconnu | ||
+ | * 02 : type ? 2 : info / 3 : Set / 4: Ack to Set / 6 : Request / 7 : reply to request - Le type est augmenté de 0x20 entre chaque échange | ||
+ | * 05 : (cmd & 0x00ff0000) >> 16; | ||
+ | * 00 : (cmd & 0xff000000) >> 24; | ||
+ | * 02 : (cmd & 0x0000ff00) >> 8; | ||
+ | * 1D : (cmd & 0x000000ff); | ||
+ | * 00 0F 06 : Valeur | ||
+ | * F2 B4 : CRC | ||
+ | |||
+ | Les octets 1 et 2 sont inversés entre la demande et la réponse : | ||
+ | |||
+ | Exemple : | ||
+ | * Demande : 053D0064 type 86 | ||
+ | * Réponse : 3D050064 type 87 | ||
+ | |||
+ | Échange suivant +0x20 | ||
+ | |||
+ | * Demande : 053D0064 type A6 | ||
+ | * Réponse : 3D050064 type A7 | ||
+ | |||
+ | |||
+ | |||
+ | ==== Calcul du CRC ==== | ||
+ | |||
+ | Le CRC se calcule avec l'ensemble des reçus | ||
+ | |||
+ | <code csharp> | ||
+ | public static string CRC_LPB(byte[] bytes) | ||
+ | { | ||
+ | int crc = 0; | ||
+ | int len = bytes.Length-1; | ||
+ | crc = (257 - len) * 256 + len - 2; | ||
+ | |||
+ | if (bytes != null && bytes.Length > 0) | ||
+ | { | ||
+ | for(int i=0;i<(len-1);i++) | ||
+ | { | ||
+ | crc += bytes[i]; | ||
+ | } | ||
+ | } | ||
+ | return String.Format("{0:X2}", crc); | ||
+ | } | ||
+ | </code> | ||
+ | | ||
+ | Si bytes[] = {0x78,0x11,0xFF,0x00,0xCC,0x02,0x00,0x14,0x02,0x05,0x00,0x02,0x1D,0x00,0x0F,0x06,0xF2,0xB4} | ||
+ | | ||
+ | Alors crc = F2B4 | ||
+ | ==== Liste des télégramme et décodage ==== | ||
+ | |||
+ | La majorité des informations ci dessous sont issu de tests (reverse engineering) et ne sont pas donc pas fiables à 100% | ||
+ | |||
+ | |FC 02 00 14 02 05 00 02 1F 00|Température extérieure| | ||
+ | |CC 02 00 14 02 05 00 02 1D 00|Température chaudière| | ||
+ | |CC 02 00 14 02 3D 2D 02 1C 00|Température ambiante| | ||
+ | |CC 02 00 14 02 31 00 02 10 01"|Température chaudière| | ||
+ | |CC 02 00 14 02 05 00 02 1D 00|?| | ||
+ | |FC 02 00 14 02 31 00 02 22 00|Température ECS| | ||
+ | |CC 02 00 14 27 25 3D 05 16 00|Température ECS fournie par la chaudière lors d'une demande du thermostat| | ||
+ | |CC 02 00 14 02 15 00 01 F8 00|Demande d’arrêt bruleur ?| | ||
+ | |CC 02 00 14 02 15 00 01 FB 32|Bruleur OFF| | ||
+ | |CC 02 00 14 02 15 00 01 F8 05|Bruleur ON| | ||
+ | |CC 02 00 14 02 3D 2D 02 0D 05|Action sur le bouton Entrée/sortie maison du thermostat| | ||
+ | |CC 02 00 14 A3 3D 2D 02 0D 06|Mode Prog 3| | ||
+ | |CC 02 00 14 02 2D 00 02 0F 05|Mode Prog 3 ACK par la chaudière| | ||
+ | |CC 02 00 14 02 3D 2D 02 0D 03|Mode été| | ||
+ | |CC 02 00 14 02 3D 2D 02 0D 03|Mode été ACK par la chaudière| | ||
+ | |FC 02 00 14 02 05 00 00 6C 00|DateTime| | ||
+ | |||
+ | === Décodage températures === | ||
+ | Toutes les températures se décodent de la même manière. | ||
+ | |||
+ | Exemple : 78 11 FF 00 FC 02 00 14 02 31 00 02 22 00 **0A 7B** F3 85 | ||
+ | |||
+ | On récupère la valeur (Ici il s'agit d'une information de température de l'ECS) | ||
+ | On convertir cette valeur en entier : 0x0A7B = d2683 | ||
+ | On divise par 64 par avoir la valeur en °C : 2683 / 64 = 41°C | ||
+ | |||
+ | === Décodage DateTime === | ||
+ | |||
+ | Exemple 78 17 FF 00 FC 02 00 14 02 05 00 00 6C 00 **75 0C 1F 07 10 0E 1A 00** EE 07 | ||
+ | |||
+ | * 75 : 1900 + 0x75 (117) = 2017 (année) | ||
+ | * 0C : 12 (mois) | ||
+ | * 1F : 31 (jour) | ||
+ | * 07 : 7eme jour de la semaine donc dimanche | ||
+ | * 10 : 16 (heure) | ||
+ | * 0E : 14 (min) | ||
+ | * 1A : 26 (secondes ?) | ||
+ | * 00 : ?? |