Mon objectif est de récupérer des données et de piloter ma chaudière de la marque Weishaupt. Cette chaudière communique avec mon thermostat via un bus numérique qui a été développé par SIEMENS. Local Process Bus LPB Je n'ai pas trouvé de document complet sur le protocole mais quelques informations par ci par là. Je vais essayer de regrouper toutes les informations dont je dispose et qui m'ont été utile ci dessous.
ND : Le bus LPB est proche du bus BSB et eBus. L'interface hardware et le format est trame est en partie équivalent. Certains des informations ci dessous peuvent dont être utilisées pour ces bus.
Liaison série sur 2 fils (Data et 0V) Nivaux signaux :
Un simple comparateur est utilisé pour convertir le signal en 0/3V compatible avec un convertisseur UART/USB du type FTDI
NB : Le même schéma peut être utilisé pour un eBus avec R2 = 6.8K les seuils étant différents :
Le bus est équvalent à une liaison série avec le RX et le TX sur le même fil et des niveaux de tension différents
Liaison UART (RS232) 4800 Bauds - 8 bits Data - parity odd - 1 stop bit
Lors de la première lecture, on obtient des trames du type :
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
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 :
for (int i = 0; i < buffer.Length; i++) { byte InvertByte = (byte)~(uint)buffer[i]; buffer[i] = InvertByte; }
Ensuite vous devivriez bien obtenir des trames debutant pour “78”
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
Exemple : 78 11 FF 00 CC 02 00 14 02 05 00 02 1D 00 0F 06 F2 B4
Les octets 1 et 2 sont inversés entre la demande et la réponse :
Exemple :
Échange suivant +0x20
Le CRC se calcule avec l'ensemble des reçus
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); }
Si bytes[] = {0x78,0x11,0xFF,0x00,0xCC,0x02,0x00,0x14,0x02,0x05,0x00,0x02,0x1D,0x00,0x0F,0x06,0xF2,0xB4} Alors crc = F2B4
La majorité des informations ci dessous sont issu de tests (reverse engineering) et ne sont pas donc pas fiables à 100%
0005021F | Température extérieure |
0005021D | Température chaudière |
2D3D021C | Température ambiante |
00310210 | Température chaudière 2 ? |
0005021E | Température retour chaudière |
00310222 | Température ECS |
3D250516 | Température ECS fournie par la chaudière lors d'une demande du thermostat |
001501FB | Bruleur OFF |
001501F8 | Bruleur ON |
2D3D020D | Le thermostat indique dans quel mode il se trouve(1) |
002D020F | ACK Mode |
050504B3 | Mode été |
050504B2 | Mode fin été ? |
0005006C | DateTime |
(1) :
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
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