La Crosse WS3500 et TX18

Jardinier amateur de tomates, qui ici nécessitent une serre pour espérer avoir une récolte, je me suis équipé d'une station La Crosse WS3500 pour y surveiller la température et l'hygrométrie. J'espérais pouvoir disposer sur mon ordinateur des données transmises par la station qui est supposée être connectable sur un port série RS232. En fait, le protocole de communication n'est absolument pas respecté et s'il est possible de transmettre les données de la station vers l'ordinateur et vice versa, c'est uniquement avec un port série PC d'origine, équipé des signaux de contrôle qui vont bien puisque les données sont en fait transmises par les signaux de contrôle.

J'ai passé pas mal de temps à décoder le protocole de communication entre l'ordinateur et la station en partant du projet open3600 sur sourceforge et j'ai même trouvé comment écrire (transmettre des données vers la station), ce qui n'était pas fonctionnel dans ce projet open3600.

Les prises RS232 étant remplacées par des prises USB sur les ordinateurs et n'étant intéressé que par la température et l'hygrométrie, je me suis dit qu'il suffirait en fait que je capte les signaux de la sonde TX18 pour avoir ce que je voulais. Je me suis donc équipé d'un module JeeLink 433MHz et j'ai commencé à essayer de recevoir les signaux. M'inspirant de ce qui avait déjà été fait pour d'autres sondes de La Crosse (voir les liens en bas de page), j'ai assez vite abouti à la réception de signaux venant de cette sonde. A ma grande surprise, ces signaux ne correspondaient à rien de connu: les données venant des sondes La Crosse ont été analysées et décryptées pour de nombreux modèles mais pas la TX18. En plus les signaux reçus se composent de 5 trames de 13 quartets qui sont répétées une fois, ce qui fait beaucoup de données pour transmettre uniquement 3 chiffres pour la température et deux chiffres pour l'hygrométrie. C'était en 2013 et je n'ai pas réussi à donner un sens aux données reçues: par exemple, alors que la température et l'hygrométrie ne variaient pas, les trames reçues étaient complètement différentes d'un message à l'autre.

Quatre ans après ces premiers essais, j'ai repris l'étude là où je l'avais laissée. Alors que j'imprimais dans la première étude les trames en binaire, j'ai regroupé les bits en octets, j'ai aligné les trames verticalement. Chaque message se compose de 8 ou dix trames, les 4 ou 5 premières trames étant ensuite répétées. Quand on met la sonde TX18 en marche en insérant les piles, tous les messages se composent de 5 trames répétées une fois, ce qui fait 10 trames par message et on reçoit un message toutes les 8 ou 9 secondes. Au bout de 20 minutes, les messages de 10 trames n'apparaissent plus que tous les 5 messages, les quatre autres étant des messages de 8 trames (4 trames répétées une fois) et on a un message toutes les 128 ou 129 secondes. Chaque trame se compose de 11 à 13 quartets (généralement 13, de temps en temps une ligne de 11 ou une ligne de 12).

La différence essentielle entre les lignes (ou trames) respectives d'un message de 5 et celles d'un message de 4, à température et hygrométrie constante, est que certains quartets sont inversés. Par exemple, voici deux messages reçus à 128 secondes d'intervalle sans que la température ni le taux d'hygrométrie n'aient changé:

AEA21FEE93BCA
AEBDE01374623
AEE21FEAAA00B
AEFDE00015548
AE021FFFEAAB8

AEA21C116C43E
AEBDE3EC8B9D8
AEFDE3FFEAAB4
AE021C0015544

Dans la première ligne de chaque message EE93BC et 116C43 sont inverses (les bits à zéro sont changés en 1 et vice versa). De même dans la 2e ligne de chaque message, 137462 et ECBB9D sont inverses. Et dans le premier message un morceau de la première ligne (21FE) est l'inverse du même morceau de la seconde (DE01). La dernière ligne et l'avant-dernière de chaque message sont quasiment inverses (001554 est l'inverse de FFEAAB) et c'est encore plus vrai à l'intérieur de chaque message (FDE0001554 est l'inverse de 021FFFEAAB).

En observant les messages défiler, on voit que tous les messages commencent par AE, suivis d'un quartet qui varie pour chaque ligne mais toujours à zéro sur la dernière du message. Les deux quartets suivants sont les mêmes sur chaque ligne à l'inversion des bits près (21 ou DE). Il m'a fallu noter ensuite la température et l'hygrométrie relevées sur la station pour chaque message reçu sur l'ordinateur avec le JeeLink. Cela m'a permis de positionner la température à la fin de la première ligne de chaque message (exactement les quartets 9 à 12) et l'hygrométrie à la fin de la seconde ligne (aussi les quartets 9 à 12). Restait à comprendre comment 93BC ou 6C43 correspondent tous les deux à une température de 22.5°C.

Si on fait un tableau des températures et des octets correspondants, on voit que le premier octet correspond aux dixièmes de degré (il change pour chaque ligne) alors que le second octet correspond aux unités et aux dizaines (il change pour chaque colonne).

19°C 20°C 21°C 22°C
.0°C B591 ou 4A6E 55BF ou AA40 B5BE ou 4A41 95BC ou 6A43
.1°C 4B91 ou B46E ABBF ou 5440 4BBE ou B441 6BBC ou 9443
.2°C 4991 ou B66E A9BF ou 5640 49BE ou B641 69BC ou 9643
.3°C B791 ou 486E 57BF ou A840 B7BE ou 4841 97BC ou 6843
.4°C 4D91 ou B26E ADBF ou 5240 4DBE ou B241 6DBC ou 9243
.5°C B391 ou 4C6E 53BF ou AC40 B3BE ou 4C41 93BC ou 6C43
.6°C B191 ou 4E6E 51BF ou AE40 B1BE ou 4E41 91BC ou 6E43
.7°C 4F91 ou B06E AFBF ou 5040 4FBE ou B041 6FBC ou 9043
.8°C 4591 ou BA6E A5BF ou 5A40 45BE ou BA41 65BC ou 9A43
.9°C BB91 ou 446E 5BBF ou A440 BBBE ou 4441 9BBC ou 6443

Maintenant si on fait le même tableau en binaire pour une colonne (la colonne 20°C) et seulement l'octet des dixièmes (le premier), on obtient:

x3x2x1x0 b7b6b5b4b3b2b1b0 b7b6b5b4b3b2b1b0
.0°C 0000 01010101 (55) 10101010 (AA)
.1°C 0001 10101011 (AB) 01010100 (54)
.2°C 0010 10101001 (A9) 01010110 (56)
.3°C 0011 01010111 (57) 10101000 (A8)
.4°C 0100 10101101 (AD) 01010010 (52)
.5°C 0101 01010011 (53) 10101100 (AC)
.6°C 0110 01010001 (51) 10101110 (AE)
.7°C 0111 10101111 (AF) 01010000 (50)
.8°C 1000 10100101 (A5) 01011010 (5A)
.9°C 1001 01011011 (5B) 10100100 (A4)

On voit assez vite que le bit x0 que l'on cherche est à 1 quand les bits b0 et b1 sont les mêmes et à zéro quand les bits b0 et b1 sont différents. Traduit en logique binaire, x0 est l'inverse du ou exclusif des bits b1 et b0. Et de manière similaire, x1 est l'inverse du ou exclusif des bits b2 et b1, x2 l'inverse du ou exclusif de b3 et b2, x3 l'inverse du ou exclusif de b4 et b3. En pratique on fait un ou exclusif entre l'octet reçu et lui-même décalé de une position à droite, on inverse le résultat et les 4 bits de poids faible sont le chiffre des dixièmes de degré. Par exemple pour la ligne .5°C:
01010011 (53) ^ 00101001 (53 décalé d'une position à droite) = 01111010 et l'inverse est 10000101 soit 0101 (5) pour le chiffre des dixièmes
10101100 (AC) ^ 01010110 (AC décalé d'une position à droite) = 11111010 et l'inverse est 00000101 soit 0101 (5) pour le chiffre des dixièmes
Que l'on prenne 53 ou AC on obtient bien le même chiffre final soit 5.

On applique quasiment la même technique (sans inversion finale) sur l'octet des unités et des dizaines et, miracle, on obtient 60 en partant de l'octet BF ou 40, 61 en partant de BE ou 41, et 62 en partant de BC ou 43. Ce qui correspond (à la constante 40 près qui permet d'éviter les valeurs négatives) aux valeurs cherchées de 20, 21 et 22.

Toujours la même technique (sans inversion finale) appliquée aux octets 5 et 6 de la deuxième ligne du message permet d'obtenir les deux chiffres du taux d'hygrométrie.

J'ai ce que je voulais et je m'arrête là. Il n'en reste pas moins qu'une grande partie du message n'a pas été décryptée. Les deux premiers quartets sont fixes et signalent le début d'une trame. Le quartet 3 indique le type de ligne (A ou D pour la température, B ou C pour l'hygrométrie, 9 ou E pour la ligne supplémentaire, F pour l'avant dernière ligne et 0 pour la dernière). Je suppose que les quartets 4 et 5 sont le numéro de sonde (qui change à chaque changement de piles) et que le quartet 13 est un quartet de contrôle. J'ai cherché mais je n'ai pas réussi à trouver un CRC qui coïncide avec ce dernier quartet. Et je ne sais pas à quoi servent les dernières lignes. Est-ce une provision pour des informations de vent ou de pluie qui n'existent pas sur cette sonde? Il faudrait voir les données envoyées par une sonde "vent + pluie" sur une station WS3600. Il reste du travail à faire pour les amateurs.

Liens qui m'ont été utiles:

Le module JeeLink: https://www.digitalsmarties.net/products/jeelink

Les sondes La Crosse dont le protocole a été décrypté:

TX3: http://www.f6fbb.org/domo/sensors/tx3_th.php

TX22: http://www.g-romahn.de/ws1600/

TX29: http://fredboboss.free.fr/articles/tx29.php