WikiElectronique

Wiki sur l'électronique et l'informatique

Outils pour utilisateurs

Outils du site


interface_chauffage_-_local_process_bus_lpb

Ceci est une ancienne révision du document !


Interface chauffage - Local Process Bus LPB

Introduction

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.

Hardware

Liaison série sur 2 fils (Data et 0V) Nivaux signaux :

  • < 7V : '1' logic (Sortie interface : 0V)
  • > 9V : '0' logic (Sortie interface : +5V)

Un simple comparateur est utilisé pour convertir le signal en 0/3V compatible avec un convertisseur UART/USB du type FTDI

Schema interface de lecture

NB : Le même schéma peut être utilisé pour un eBus avec R2 = 6.8K les seuils étant différents :

  • 9-12V : '0' logic (Sortie interface : 0V)
  • 15-24V : '1' logic (Sortie interface : +5V)

Protocole

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

1er lecture

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 

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 02 00 14 02 05 00 02 1D 00 : Nom du telegramme (Reste à preciser) - Toujours de 10 octects

Tentative de décodage du nom du télégramme:

  1. CC : Flag d'envoi ou de réception ?
  2. 02 : inconnu
  3. 00 : inconnu
  4. 14 : inconnu
  5. 02 : type ? 2 : info / 3 : Set / 4: Ack to Set / 6 : Request / 7 : reply to request
  6. 05 : (cmd & 0x00ff0000) » 16;
  7. 00 : (cmd & 0xff000000) » 24;
  8. 02 : (cmd & 0x0000ff00) » 8;
  9. 1D : (cmd & 0x000000ff);
  10. 00 : valeur

Les octect 1 et 2 sont inversés entre la demande et la réponse :

Exemple :

  • Demande : 053D0064 type 86
  • Réponse : 3D050064 type 87
  • 0F 06 : Valeur du telegramme
  • F2 B4 : CRC

Calcul du CRC

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 

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 00Température extérieure
CC 02 00 14 02 05 00 02 1D 00Température chaudière
CC 02 00 14 02 3D 2D 02 1C 00Tempé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 00Température ECS
CC 02 00 14 27 25 3D 05 16 00Température ECS fournie par la chaudière lors d'une demande du thermostat
CC 02 00 14 02 15 00 01 F8 00Demande d’arrêt bruleur ?
CC 02 00 14 02 15 00 01 FB 32Bruleur OFF
CC 02 00 14 02 15 00 01 F8 05Bruleur ON
CC 02 00 14 02 3D 2D 02 0D 05Action sur le bouton Entrée/sortie maison du thermostat
CC 02 00 14 A3 3D 2D 02 0D 06Mode Prog 3
CC 02 00 14 02 2D 00 02 0F 05Mode Prog 3 ACK par la chaudière
CC 02 00 14 02 3D 2D 02 0D 03Mode été
CC 02 00 14 02 3D 2D 02 0D 03Mode été ACK par la chaudière
FC 02 00 14 02 05 00 00 6C 00DateTime

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 : ??
interface_chauffage_-_local_process_bus_lpb.1524403239.txt.gz · Dernière modification: 2018/04/22 15:20 par 88.164.131.165 · Actuellement bloqué par: 44.200.23.133