Go Down

Topic: [résolu] Reverse engineering protocole thermopompe hayward (Read 3342 times) previous topic - next topic

michelvallee

#15
Aug 16, 2019, 11:52 pm Last Edit: Aug 17, 2019, 01:58 pm by michelvallee
Merci j'ai bien hâte d'essayer ça!




plode


bonjour à tous & atlas2003

@atlas2003 :
Je n'ai pas encore de carte "ESP8266" et je ne peut pas tester lon programme. J'en ai commandée une et dés reception, je  te tiens au courant.

En attendant, j'ai essayé d'analysé un peu plus le signal "NET" de la PAC Hayward. De mon côté j'ai une EcoPac, mais je pense que c'est le même protocole.

J'ai fait deux petits sketchs avec un uno pour analyser le signal et comprendre les trames. cf attachement.

Le sketch V2 permet juste de capturer les durées des transitions LOW / HIGH sur le cable "NET".
Cela m'a permis de retrouver les conclusions de atlas2003 :
Principalement, on a 3 types HIGH  : 5 ms (debut de trame), 3ms( bit 0) et 1ms (bit 1)
Par contre, chaque fin de frame est suivit d'un silence à l'état HIGH de 125 ms ou de 1s.
Le silence est suivi d'un LOW de 9ms.

Le sketch V4 utilise ces informations de durée pour capturer les trames (comme le fait atlas2003)
Cependant, je l'ai réécrit afin d'avoir un décodage des trames non bloquants, pour permettre de faire autre chose
(comme par exemple, envoyer une trame pour donner un ordre à la PAC ... a faire)

Ce sketch m'a permis de constater que, par défaut, la PAC envois un cycle de 16 trames, et donc 16 silences, dont 4 sont de 1s. Il y a 14 trames longues (de 12 bytes) et 2 trames courtes (de 9 bytes)

La séquence des 16 trames est (le numéro entre crochet est le numéro de la trame lors de l'aquistion)

[10] "d1b1050000000078607617ec"
[11] "d2b111e07b4f7000000000ae"
[12] "82b11638575a103c020164e5"
[13] "81b11b7276723d3d3d3d3cd7"

[14] "d1b1000f0f00007860761705"
[15] "86b100000000000000000037"
[16] "84b18c5a505064780006009d"
[17] "85b142064a1600080000cdb3"

[18] "d1b1050000000078607617ec"
[19] "d2b111e07b4f7000000000ae"
[20] "82b11638575a103c020164e5"
[21] "81b11b7276723d3d3d3d3cd7"

[22] "d1b1000f0f00007860761705"
[23] "83b146230a23234c825a7c91"
[24] "d21b1d2d020da0eafe"     
[25] "dd1d1f09121a000071"   

les silences de 1s semble être "autour" des trames dont l'entête est d1b1
(attention, toutes ces informations sont à vérifier. Le codage en little Endian complique
 les choses, et on ne connait pas le protocole de communication de Hayward).

Pendant l'acquisition des trames j'ai fait des "entrées" (modification de la température de consigne de + ou - 0,5°C ").
Si joint les passages ou apparaissent des nouvelles trames (qui sont probablement celle qu'il va falloir émuler pour
envoyer des ordres à la PAC.
 
[53] "81b11b7276723d3d3d3d3cd7"  // Trame issu du cycle de la PAC

[54] "353535353535353535353551" // Autres trames.
[55] "304effffa7fee4f4f6fffff7"
[56] "353535353535353535353551"
[57] "304effffa7fee4f4f6fffff7"
[58] "353535353535353535353551"
[59] "304effffa7fee4f4f6fffff7"
[60] "353535353535353535353551"
[61] "304effffa7fee4f4f6fffff7"
[62] "353535353535353535353551"
[63] "304effffa7fee4f4f6fffff7"
[64] "353535353535353535353551"
[65] "304effffa7fee4f4f6fffff7"

[66] "d1b1000f0f00007860761705" // retour au cycle des trames de la PACs

...

75] "86b100000000000000000037" // trame du cycle de la PAC

[76] "7e4ee48d888dc2c2c2c2c327" // Autre trames.
[77] "353535353535353535353551"
[78] "7e4ee48d888dc2c2c2c2c327"
[79] "304effffa7fee4f4f6fffff7"
[80] "7e4ee48d888dc2c2c2c2c327"
[81] "353535353535353535353551"
[82] "7e4ee48d888dc2c2c2c2c327"
[83] "304effffa7fee4f4f6fffff7"
[84] "7e4ee48d888dc2c2c2c2c327"
[85] "353535353535353535353551"
[86] "7e4ee48d888dc2c2c2c2c327"
[87] "304effffa7fee4f4f6fffff7"

[88] "84b18c5a505064780006009d" // retour au cycle.
...


Maintenant, je vais pouvoir capturer sur mon serveur MySensors des trames sur une plus longue durée pour essayer de compléter le reverse engineering fait par altas2003.

A suivre (ca prend du temps ...)



atlas2003

Ha super,

Du coup tu m'as donné envie de me relancer un peu dans le projet :)
Mes premiers essais date de 2014... Et je n'avais pas reussis tout a seule a commander la termopompe. J'avais donc arrété le projet en me disant que recevoir les infos etait déja bien.

Il faudrait que je fouille dans mes fichiers. Je dois avoir encore des exemples de capture de trame qui trainent.


atlas2003

Bon, j'ai craqué. J'avais justement acheté un nouveau "logic analyser" en decembre dernier que je n'avais pas encore utilisé. L'ancien que j'avais utilisé pour mes toutes premières captures il y a 4 ou 5 ans n'etait pas très puissant. Je ne pouvais pas avoir beaucoup de donnée en une seule fois.

Ce soir avec le nouveau, j'ai pu capturer plusieurs minutes de data.

Le tout est dispo sur ce repo:
https://github.com/njanik/hayward-pc1000-reverse-engineering-data

Prochaine étape, faire un petit script pour parser les données et y voir plus clair.


plode

#19
Aug 22, 2019, 09:36 am Last Edit: Aug 22, 2019, 09:38 am by plode
Bonjour à tous & atlas2003

J'ai regardé ta première acquisition (A.csv).
De mon côté, j'avais fait un script R pour décoder les acquisitions faites avec le premier petit programme (le V2)
C'est la même idée que ton acquisition : avoir des enregistrements d'état, avec l'état et la durée.
Il y a juste 3 différences dans le format : Ta durée est acquise en seconde, celle du nano en micro seconde.
L'ordre des colonnes durée / état est inversée et le séparateur est la virgule vs le point virgule.
Sinon, c'est la même structure de donnée.

J'ai donc appliqué le script ci-dessous sur le fichier A.
A l'exception de quelques trames "mal formée" / ou "mal décodée", c'est compatible.
Si joint les trames correspondantes au fichier A.csv

Le programme R est "brut de décoffrage" : C'est juste pour explorer. C'est lui qui m'a permis d'écrire le sketch V4.
A priori, j'ai l'impression que maintenant il faut plus travailler sur la structure des trames que sur la conversion du signal en trames. J'ai été obligé de remplacé l'extension .R (par défaut pour les programmes en R) en .txt car les ".R" ne sont pas autorisés en attachement.

A suivre ...



> tramesHexa
 [1] "d1b100000f00007872740ffe"
 [2] "83b138230a30234c825a8296"
 [3] "d2121b2d070da0acba"      
 [4] "dd1c1c191b19000085"      
 [5] "d1b100000f00007872740ffe"
 [6] "d2b1115e746e6e0000000042"
 [7] "82b1162e565a100f02010049"
 [8] "81b1166072783d3d3d3d0086"
 [9] "d1b100000f00007872740ffe"
[10] "83b138230a30234c825a8296"
[11] "84b18c5a505064780006009d"
[12] "85b100061e50640c0ef00018"
[13] "d1b100000f00007871740ffd"
[14] "d2b1115e746e6e0000000042"
[15] "82b1162e565a100f02010049"
[16] "81b1166072783d3d3d3d0086"
[17] "d1b100000f00007871740ffd"
[18] "83b138230a30234c825a8296"
[19] "d2121b2d070da0acba"      
[20] "dd1c1c191a19000084"      
[21] "d1b100000f00007871740ffd"
[22] "d2b1115e746e6e0000000042"
[23] "82b1162e565a100f02010049"
[24] "81b1166072783d3d3d3d0086"
[25] "d1b100000f00007871740ffd"
[26] "83b138230a30234c825a8296"
[27] "84b18c5a505064780006009d"
[28] "85b100061e50640c0ef00018"
[29] "d1b100000f00007871740ffd"
[30] "not a correct trame"    
[31] "not a correct trame"    
[32] "7e4ee89f8d87c2c2c2c2ff78"
[33] "7e4ee89f8d87c2c2c2c2ff78"
[34] "7e4ee89f8d87c2c2c2c2ff78"
[35] "7e4ee89f8d87c2c2c2c2ff78"
[36] "7e4ee89f8d87c2c2c2c2ff78"
[37] "7e4ee89f8d87c2c2c2c2ff78"
[38] "81b1176072783d3d3d3d0087"
[39] "d1b100020f00007871740fff"
[40] "83b138230a30234c825a8296"
[41] "d2121b2d070da0ecfa"      
[42] "dd1c1c191a19000084"      
[43] "d1b100020f00007871740fff"
[44] "d2b1115e746e6e0000000042"
[45] "82b1162e565a100f02010049"
[46] "81b1176072783d3d3d3d0087"
[47] "d1b100020f00007871740fff"
[48] "83b138230a30234c825a8296"
[49] "84b18c5a505064780006009d"
[50] "85b100061e50640c0ef00018"
[51] "d1b100020f00007871740fff"
[52] "7e4ee99f8d87c2c2c2c2ff79"
[53] "7e4ee99f8d87c2c2c2c2ff79"
[54] "7e4ee99f8d87c2c2c2c2ff79"
[55] "7e4ee99f8d87c2c2c2c2ff79"
[56] "7e4ee99f8d87c2c2c2c2ff79"
[57] "7e4ee99f8d87c2c2c2c2ff79"
[58] "7e4ee99f8d87c2c2c2c2ff79"
[59] "7e4ee99f8d87c2c2c2c2ff79"
[60] "d2b1115e746e6e0000000042"
[61] "82b1162e565a100f02010049"
[62] "81b1166072783d3d3d3d0086"
[63] "d1b100000f00007871740ffd"
[64] "83b138230a30234c825a8296"
[65] "d2121b2d070da0acba"      
[66] "dd1c1c191a19000084"      
[67] "d1b100000f00007871740ffd"
[68] "d2b1115e746e6e0000000042"
[69] "82b1162e565a100f02010049"
[70] "81b1166072783d3d3d3d0086"
[71] "d1b100000f00007871740ffd"
[72] "83b138230a30234c825a8296"
[73] "84b18c5a505064780006009d"
[74] "85b100061e50640c0ef00018"
[75] "d1b100000f00007871740ffd"
[76] "7e4ee89f8d87c2c2c2c2ff78"
[77] "7e4ee89f8d87c2c2c2c2ff78"
[78] "7e4ee89f8d87c2c2c2c2ff78"
[79] "7e4ee89f8d87c2c2c2c2ff78"
[80] "7e4ee89f8d87c2c2c2c2ff78"
[81] "7e4ee89f8d87c2c2c2c2ff78"
[82] "7e4ee89f8d87c2c2c2c2ff78"
[83] "7e4ee89f8d87c2c2c2c2ff78"
[84] "d2b1115e746e6e0000000042"
[85] "82b1162e565a100f02010049"
[86] "81b1176072783d3d3d3d0087"
[87] "d1b100020f00007871740fff"
[88] "83b138230a30234c825a8296"
[89] "d2121b2d070da0ecfa"      
[90] "dd1c1c191a19000084"      
[91] "d1b100020f00007871740fff"
[92] "d2b1115e746e6e0000000042"
[93] "82b1162e565a100f02010049"
[94] "81b1176072783d3d3d3d0087"
[95] "d1b100020f00007871740fff"
[96] "83b138230a30234c825a8296"
[97] "84b18c5a505064780006009d"
[98] "85b100061e50640c0ef00018"
[99] "d1b100020f00007871740fff"
[100] "d2b1115e746e6e0000000042"
[101] "82b1162e565a100f02010049"
[102] "81b1176072783d3d3d3d0087"
[103] "d1b100020f00007871740fff"
[104] "83b138230a30234c825a8296"
[105] "d2121b2d070da0ecfa"      
[106] "dd1c1c191a19000084"      
[107] "d1b100020f00007871740fff"
[108] "d2b1115e746e6e0000000042"
[109] "82b1162e565a100f02010049"
[110] "81b1176072783d3d3d3d0087"
[111] "d1b100020f00007871740fff"
[112] "83b138230a30234c825a8296"
[113] "84b18c5a505064780006009d"
[114] "85b100061e50640c0ef00018"
[115] "d1b100020f00007871740fff"
[116] "d2b1115e746e6e0000000042"
[117] "82b1162e565a100f02010049"
[118] "81b1176072783d3d3d3d0087"
[119] "d1b100020f00007871740fff"
[120] "83b138230a30234c825a8296"
[121] "d2121b2d070da0ecfa"      
[122] "dd1c1c191a19000084"      
[123] "d1b100020f00007871740fff"
[124] "d2b1115e746e6e0000000042"
[125] "82b1162e565a100f02010049"
[126] "81b1176072783d3d3d3d0087"
[127] "d1b100020f00007871740fff"
[128] "83b138230a30234c825a8296"
[129] "84b18c5a505064780006009d"
[130] "85b100061e50640c0ef00018"
[131] "d1b100020f00007871740fff"
[132] "d2b1115e746e6e0000000042"
[133] "82b1162e565a100f02010049"
[134] "81b1176072783d3d3d3d0087"
[135] "not a correct trame"    
[136] "7e4ee99f8d87c2c2c2c2ff79"
[137] "7e4ee99f8d87c2c2c2c2ff79"
[138] "7e4ee99f8d87c2c2c2c2ff79"
[139] "7e4ee99f8d87c2c2c2c2ff79"
[140] "7e4ee99f8d87c2c2c2c2ff79"
[141] "7e4ee99f8d87c2c2c2c2ff79"
[142] "7e4ee99f8d87c2c2c2c2ff79"
[143] "not a correct trame"    
[144] "304efffff7f7f797f7fffff7"
[145] "304efffff7f7f797f7fffff7"
[146] "304efffff7f7f797f7fffff7"
[147] "304efffff7f7f797f7fffff7"
[148] "304efffff7f7f797f7fffff7"
[149] "304efffff7f7f797f7fffff7"
[150] "304efffff7f7f797f7fffff7"
[151] "d2121b2d070da0acba"      
[152] "dd1c1c191a19000084"      
[153] "d1b100000f00007871740ffd"
[154] "d2b1115e746e6e0000000042"
[155] "82b1162e565a100f02010049"
[156] "81b1166072783d3d3d3d0086"
[157] "d1b100000f00007871740ffd"
[158] "83b138230a30234c825a8296"
[159] "84b18c5a505064780006009d"
[160] "85b100061e50640c0ef00018"
[161] "d1b100000f00007871740ffd"
[162] "d2b1115e746e6e0000000042"
[163] "not a correct trame"    
[164] "7e4ee89f8d87c2c2c2c2ff78"
[165] "7e4ee89f8d87c2c2c2c2ff78"
[166] "7e4ee89f8d87c2c2c2c2ff78"
[167] "7e4ee89f8d87c2c2c2c2ff78"
[168] "7e4ee89f8d87c2c2c2c2ff78"
[169] "83b138230a30234c825a8296"
[170] "d2121b2d070da0ecfa"      
[171] "dd1c1c191a19000084"      
[172] "d1b100020f00007871740fff"
[173] "d2b1115e746e6e0000000042"
[174] "82b1162e565a100f02010049"
[175] "81b1176072783d3d3d3d0087"
[176] "d1b100020f00007871740fff"
[177] "83b138230a30234c825a8296"
[178] "84b18c5a505064780006009d"
[179] "85b100061e50640c0ef00018"
[180] "d1b100020f00007871740fff"
[181] "d2b1115e746e6e0000000042"
[182] "82b1162e565a100f02010049"
[183] "81b1176072783d3d3d3d0087"
[184] "d1b100020f00007871740fff"
[185] "83b138230a30234c825a8296"
[186] "d2121b2d070da0ecfa"      
[187] "dd1c1c191a19000084"      
[188] "d1b100020f00007871740fff"
[189] "d2b1115e746e6e0000000042"
[190] "82b1162e565a100f02010049"
[191] "81b1176072783d3d3d3d0087"
[192] "d1b100020f00007871740fff"
[193] "83b138230a30234c825a8296"
[194] "84b18c5a505064780006009d"
[195] "85b100061e50640c0ef00018"
[196] "d1b100020f00007871740fff"
[197] "d2b1115e746e6e0000000042"
[198] "82b1162e565a100f02010049"
[199] "81b1176072783d3d3d3d0087"
[200] "d1b100020f00007871740fff"
[201] "83b138230a30234c825a8296"
[202] "d2121b2d070da0ecfa"      
[203] "dd1c1c191a19000084"      
[204] "d1b100020f00007871740fff"
[205] "d2b1115e746e6e0000000042"
[206] "82b1162e565a100f02010049"
[207] "81b1176072783d3d3d3d0087"
[208] "d1b100020f00007871740fff"
[209] "83b138230a30234c825a8296"
[210] "84b18c5a505064780006009d"
[211] "85b100061e50640c0ef00018"
>


plode

Bonjour,


La structure de ton acquisition est semblable à la mienne : Par défaut, un cycle de 16 trames, 14 de 12 bytes et 2 de 9 bytes.
Toutes tes trames se finissent par un silence de 100, 150 ms ou 1s. Les  long silence (1s) sont toutes les 4 trames

Pour les trames avec erreur, c'est probablement du au fait que j'ai été trop strict sur les durée.
Par exemple :

> data3[32310:32320,]
           time level        t2 delay type
32310 109504480     0 109505680  1200 <NA>
32311 109505680     1 109508480  2800 <NA>
32312 109508480     0 109509680  1200 <NA>
32313 109509680     1 109512480  2800 <NA>
32314 109512480     0 109513680  1200 <NA>
32315 109513680     1 109516480  2800 <NA>
32316 109516480     0 109517680  1200 <NA>
32317 109517680     1 109518640   960  1ms
32318 109518640     0 109519640  1000  1ms
32319 109519640     1 109520480   840 <NA>
32320 109520480     0 109521640  1160 <NA>


il y a des NA dans la colonne type par ce que 1200us a été jugé trop loin de 1000us ...
Pour résoudre cela, il suffit d'être plus tolérant sur les délais.

A suivre ...
Laurent


atlas2003

Ha oui aussi:

Hier, en regardant le graphique (celui de la capture où je n'ai pas touché au clavier), et en faisant un zoom arrière, je me suis aussi apercu qu'il y avait une trame différente exactement toutes les minutes.

Chose que je n'avais pas remaqué dans le temps ou mes captures faisait seulement quelques dizaine de seconde.
Peut etre qu'il s'agit de la trame qui a des timings differents.

Peut etre que c'est tout simplement lié au l'horloge sur l'ecran. Je n'ai pas pensé a verifier quand arrivait le changement de minute par rapport à ma capture.

A la fin de mon script, j'affichais aussi une la totalité des timings que j'avais ansi que leur occurence

La c'est pour la capture ou je n'ai touché a rien:

Code: [Select]

Sort by duration // [duration] => occurence
Array
(
    [80] => 1
    [55] => 1
    [6] => 1
    [101] => 1
    [12] => 1
    [19] => 1
    [2002] => 2
    [7] => 2
    [10] => 3
    [2003] => 3
    [4] => 3
    [102] => 29
    [1003] => 100
    [0] => 231
    [2] => 282
    [152] => 307
    [5] => 445
    [9] => 450
    [3] => 24542
    [1] => 59164
)

Sort by occurence // [duration] => occurence
Array
(
    [0] => 231
    [1] => 59164
    [2] => 282
    [3] => 24542
    [4] => 3
    [5] => 445
    [6] => 1
    [7] => 2
    [9] => 450
    [10] => 3
    [12] => 1
    [19] => 1
    [55] => 1
    [80] => 1
    [101] => 1
    [102] => 29
    [152] => 307
    [1003] => 100
    [2002] => 2
    [2003] => 3
)




et là lorsque je suis passé à ON / OFF plusieurs fois

Code: [Select]

Sort by duration // [duration] => occurence
Array
(
    [53] => 1
    [178] => 1
    [770] => 1
    [119] => 1
    [29] => 1
    [10] => 3
    [2002] => 3
    [2003] => 3
    [102] => 38
    [1003] => 39
    [0] => 44
    [2] => 64
    [152] => 124
    [5] => 212
    [9] => 218
    [3] => 11700
    [1] => 29102
)

Sort by occurence // [duration] => occurence
Array
(
    [0] => 44
    [1] => 29102
    [2] => 64
    [3] => 11700
    [5] => 212
    [9] => 218
    [10] => 3
    [29] => 1
    [53] => 1
    [102] => 38
    [119] => 1
    [152] => 124
    [178] => 1
    [770] => 1
    [1003] => 39
    [2002] => 3
    [2003] => 3
)



Moi je pense qu'il y a de temps en temps des colisions de frame lorsque la carte PC1000 envoit de l'info, et qu'en meme temps, on change la température via le clavier.


atlas2003

#22
Aug 24, 2019, 05:57 am Last Edit: Aug 24, 2019, 06:08 am by atlas2003
Ok, j'ai poursuivis l'étude des captures ce soir.
Je pense avoir fait d'ÉNORMES progrès sur la compréhension du protocole.

Selon moi, il y a deux familles de trames:

Famille A = Trames envoyés par la carte PC1000 (celles qui contiennent les infos de la température actuelle, la température programmé, le mode etc...)

Famille B = Trames envoyés par le module clavier / ecran de la thermopompe.


Specs de A:
Envoyé par groupe de 4.
Chaque trame est séparé par 152ms
Chaque GROUPE de ses 4 trames est séparé par 1s


Specs de B
:
Envoyé par groupe de 8 (je crois)
Chaque trame est séparé par 101ms
Une fois le groupe envoyé, il y a une pause de 2 secondes avant que les les groupes de type A reprennent leur cycle.
Même si on ne touche pas au clavier, ce groupe de trame est envoyé exactement 1 fois toutes les minutes (comme je disais un peu plus haut, il s'agit peut etre de l'horloge de l'ecran qui change de minute ? Mais pourquoi envoyé cette info à la carte PC1000...)


------------------------------------------------------

Je confirme ma théorie du conflit. Il arrive très souvent que les deux familles de trame soient un peu mélangé.
Quand on change la température au clavier, la majorité du temps, le groupe de trame B est envoyé alors qu'un groupe de trame A est deja commencé.
C'est là que les trames se superposent et qu'on obtient des timings bizarre qui ne veulent plus rien dire.

Sauf que, étant donné que le groupe B est composé de 8 trames (et qu'il est donc plus long que le groupe A qui n'en a que 4), la fin du groupe B est toujours affiché sans superposition (vu que le groupe A est terminé depuis un bout)
De plus, je pense que comme le groupe A est terminé, il est rendu à sa pause de 1 seconde.
Selon moi, cette pause permet à la carte PC1000 "d'écouter" si justement il n'y aurait pas une trame B en train d'envoyer un signal du clavier.
Ça doit être le cas, car les trames A ne repartent pas tout de suite. À la place, il y a une pause de 2 secondes avant qu'elles reprennent.

A cause de la superposition, il y a donc quelques trames qui sont inutilisable par le module clavier le module PC1000.
Dans les 8 trames, il y a donc surement une répétition du data pour être certain que l'info est bien passé.

En sachant tout cela, je vais pouvoir facilement maintenant ignoré toutes les trames superposé.
C'est assez facile a detecter.
Après je pense que le travail va etre beaucoup plus facile! il ne restera plus qu'a decoder les trames de la famille B vu que celle de A sont deja faites, puis tester la théorie avec un petit programme.

atlas2003

Bonne nouvelle, je suis repassé sur mon script pour analyser les trames type B valides et:
Cela confirme encore un peu ce que je disais au dessus car quand le groupe de 8 trames est envoyé, les 8 trames sont toutes identiques.
Ça doit bien pour être sur qu'une des 8 sera bien lu malgré les superpositions qui rendront les autres invalides.

Une trame de type B = 12 bytes.


plode

Super.
De mon côté, rien de nouveau. Je suis en train de faire un script coté serveur (avec node-red que je découvre ...) pour mettre en base de donnée les trames de la PAC (que ce soit les trames de la carte mère (je n'ai pas la même que la tienne) ou les trames du clavier).

atlas2003

Peux donner ton modèle de carte contrôleur et ton modèle de thermopompe?

Node-red c'est super :)

plode

Ma PAC est une Hayward EcoPac Powerline
La carte mère, de mémoire est une PIC1001

Je pense que on est sur les mêmes protocoles.

Sinon, j'ai commencé a récupérer toutes les trames (mêmes celles qui semble avoir des erreurs) sur mon serveur et à les stocker pour les analyser.

J'ai l'impression que le début de la trame contient une information "d'adresse" (quelle registre ?) et une information de fonction (?)
(un peu comme le protocole modbus)

de mon côté (sur 12h sans interventions) :
Les 4 octets / 2 bytes les plus fréquent sont d1b1  (22% des trames)
Les entêtes les plus fréquentes sont

> signif(table(data$entete)[freq_adress] / nrow(data)*100,3)

     12    304e    3535    81b1    82b1    83b1    84b1    85b1    86b1    d1b1    d21b    d2b1
 0.0379  6.2200  6.1600 10.7000 10.9000  5.6800  5.4500  5.3600  5.6700 22.1000  5.3100 11.3000
   dd1d    dd1e
 1.3700  3.7600

a noter la suite d'entêtes : 81b1, 82b1, 83b1, 84b1, 85b1

A bientôt







plode

Je n'ai pas encore eu le temps de regarder pour les collisions.
J'ai le même constat que toi sur les checkSum : Si on les calcule classiquement  ( somme des n-1 bytes vs dernier bytes) on obtient un écart de 1, 2 ou 3 la plus part du temps.
Cependant on a un pattern particulier qui est peut être en relation avec tes collisions ?

Ci-joint deux images, en ordonnée la valeur du checksum, et abscisse, l'indice d'acquisition de la trame.
La première est pour les 1000 premières trames, la deuxième pour les 100 premières.

Le motif est trop régulier pour que ce soit une erreur de transmission, mais plutôt que on ne connait pas le protocol du calcul de checksum de Hayward ...

A suivre

atlas2003

Ha c'est bien que tu trouves la meme chose que moi pour le checksum. Je n'avais pas approfondie la chose.
Par contre tu me perds quand tu expliques le prototcole qui semble etre du modbus (?) je ne connais pas du tout.

De mon coté, j'ai continué mon script.
J'ai trouver ou setter la température, le mode et le power on/off sur les trames de type B.
Mon but étant de verifier sur le calcul du checksum des trames B est le meme que les A.

En travaillant sur cela, j'ai trouvé quelque chose de bizarre:

Sur les trames A,
0 binaire = 3ms
1 binaire = 1ms

Mais sur les trames B c'est l'inverse:
0 binaire = 1ms
1 binaire = 3ms

Je continue


plode


Pour les checkSum, en fait, c'est un peu normal, car je me suis basé sur ton code. Ca montrait que mes trames étaient proches des tiennes.

Par contre, je viens de modifier ton code de CheckSum et maintenant j'obtiens assez souvent des 0, ce qui est sympathique.
J'ai fait modulo 256 et pas modulo 255
(sous R : sum(bt[1:(n-1)])%% 256 - bt[n] : bt la trame en byte, et n le nombre de byte.

Si dessous les 100 premiere trames de mon acquisition.

J'ai par contre des checksum non null pour certaines trames. C'est peut être les trames "B" dont tu parles.

Sinon le protocole modbus, c'est un protocole assez classique, dont la trame va contenir 4 parties :

Une adresse, (sur un byte )
Une fonction, (sur un byte )
Les informations a transmettre sur x bytes
Un checkSum (sur un byte)

Si on était sur une telle structure de trame, une entête de la forme "d1b1" pourrait vouloir dire
appliquer la fonction b1  (et on ne sait pas ce que c'est) sur le registre d1( et on ne sait pas nom plus), avec les données qui suivent (byte de 3 à n-1)

A suivre ...
Best regards
Laurent






> data[1:100,]
               t                     mess entete checkSum
1   1.566661e+12 d1b100000f000078607917f9   d1b1        0
2   1.566661e+12 83b146230a23234c825a7c91   83b1        0
3   1.566661e+12       d21b1d2d020da0eafe   d21b      -46
4   1.566661e+12       dd1e1e16121e000082   dd1e      -35
5   1.566661e+12 d1b1050000000078607917ef   d1b1        0
6   1.566661e+12 d2b1115e796978000000004c   d2b1        0
7   1.566661e+12 82b11638575a103c020164e5   82b1        0
8   1.566661e+12 81b11b7277723d3d3d3d3cd8   81b1        0
9   1.566661e+12 d1b100000f000078607917f9   d1b1        0
10  1.566661e+12 85b142064a1600080000cdb3   85b1        0
11  1.566661e+12 d1b1050000000078607917ef   d1b1        0
12  1.566661e+12 d2b1115e796978000000004c   d2b1        0
13  1.566661e+12 82b11638575a103c020164e5   82b1        0
14  1.566661e+12 83b146230a23234c825a7c91   83b1        0
15  1.566661e+12       d21b1d2d020da0eafe   d21b      -46
16  1.566661e+12       dd1e1e16121e000082   dd1e      -35
17  1.566661e+12 d1b1050000000078607917ef   d1b1        0
18  1.566661e+12 d2b1115e796978000000004c   d2b1        0
19  1.566661e+12 82b11638575a103c020164e5   82b1        0
20  1.566661e+12 81b11b7277723d3d3d3d3cd8   81b1        0
21  1.566661e+12 d1b100000f000078607917f9   d1b1        0
22  1.566661e+12 86b100000000000000000037   86b1        0
23  1.566661e+12 84b18c5a505064780006009d   84b1        0
24  1.566661e+12 85b142064a1600080000cdb3   85b1        0
25  1.566661e+12 d1b1050000000078607917ef   d1b1        0
26  1.566661e+12 d2b1115e796978000000004c   d2b1        0
27  1.566661e+12 82b11638575a103c020164e5   82b1        0
28  1.566661e+12 81b11b7277723d3d3d3d3cd8   81b1        0
29  1.566661e+12 d1b100000f000078607917f9   d1b1        0
30  1.566661e+12 83b146230a23234c825a7c91   83b1        0
31  1.566661e+12       d21b1d2d020da0eafe   d21b      -46
32  1.566661e+12       dd1e1e16121e000082   dd1e      -35
33  1.566661e+12 d1b1050000000078607917ef   d1b1        0
34  1.566661e+12 d2b1115e796978000000004c   d2b1        0
35  1.566661e+12 82b11638575a103c020164e5   82b1        0
36  1.566661e+12 81b11b7277723d3d3d3d3cd8   81b1        0
37  1.566661e+12 d1b100000f000078607917f9   d1b1        0
38  1.566661e+12 86b100000000000000000037   86b1        0
39  1.566661e+12 84b18c5a505064780006009d   84b1        0
40  1.566661e+12 85b142064a1600080000cdb3   85b1        0
41  1.566661e+12 d1b1050000000078607917ef   d1b1        0
42  1.566661e+12 d2b1115e796978000000004c   d2b1        0
43  1.566661e+12 82b11638575a103c020164e5   82b1        0
44  1.566661e+12 81b11b7277723d3d3d3d3cd8   81b1        0
45  1.566661e+12 d1b100000f000078607917f9   d1b1        0
46  1.566661e+12 83b146230a23234c825a7c91   83b1        0
47  1.566661e+12 353535353535353535353551   3535      -10
48  1.566661e+12 304effffa7fdfdeed5ffffe8   304e      -10
49  1.566661e+12 353535353535353535353551   3535      -10
50  1.566661e+12 304effffa7fdfdeed5ffffe8   304e      -10
51  1.566661e+12 353535353535353535353551   3535      -10
52  1.566661e+12 304effffa7fdfdeed5ffffe8   304e      -10
53  1.566661e+12 353535353535353535353551   3535      -10
54  1.566661e+12 304effffa7fdfdeed5ffffe8   304e      -10
55  1.566661e+12 353535353535353535353551   3535      -10
56  1.566661e+12 304effffa7fdfdeed5ffffe8   304e      -10
57  1.566661e+12 353535353535353535353551   3535      -10
58  1.566661e+12 304effffa7fdfdeed5ffffe8   304e      -10
59  1.566661e+12       d21b1d2d020da0eafe   d21b      -46
60  1.566661e+12       dd1e1e16121e000082   dd1e      -35
61  1.566661e+12 d1b1050000000078607917ef   d1b1        0
62  1.566661e+12 d2b1115e796978000000004c   d2b1        0
63  1.566661e+12 82b11638575a103c020164e5   82b1        0
64  1.566661e+12 81b11b7277723d3d3d3d3cd8   81b1        0
65  1.566661e+12 d1b100000f000078607917f9   d1b1        0
66  1.566661e+12 86b100000000000000000037   86b1        0
67  1.566661e+12 84b18c5a505064780006009d   84b1        0
68  1.566661e+12 85b142064a1600080000cdb3   85b1        0
69  1.566661e+12 d1b1050000000078607917ef   d1b1        0
70  1.566661e+12 d2b1115e796978000000004c   d2b1        0
71  1.566661e+12 82b11638575a103c020164e5   82b1        0
72  1.566661e+12 81b11b7277723d3d3d3d3cd8   81b1        0
73  1.566661e+12 d1b100000f000078607917f9   d1b1        0
74  1.566661e+12 83b146230a23234c825a7c91   83b1        0
75  1.566661e+12       d21b1d2d020da0eafe   d21b      -46
76  1.566661e+12       dd1e1e16121e000082   dd1e      -35
77  1.566661e+12 d1b1050000000078607917ef   d1b1        0
78  1.566661e+12 d2b1115e796978000000004c   d2b1        0
79  1.566661e+12 82b11638575a103c020164e5   82b1        0
80  1.566661e+12 81b11b7277723d3d3d3d3cd8   81b1        0
81  1.566661e+12 d1b100000f000078607917f9   d1b1        0
82  1.566661e+12 86b100000000000000000037   86b1        0
83  1.566661e+12 84b18c5a505064780006009d   84b1        0
84  1.566661e+12 85b142064a1600080000cdb3   85b1        0
85  1.566661e+12 d1b1050000000078607917ef   d1b1        0
86  1.566661e+12 d2b1115e796978000000004c   d2b1        0
87  1.566661e+12 82b11638575a103c020164e5   82b1        0
88  1.566661e+12 81b11b7277723d3d3d3d3cd8   81b1        0
89  1.566661e+12 d1b100000f000078607917f9   d1b1        0
90  1.566661e+12 83b146230a23234c825a7c91   83b1        0
91  1.566661e+12       d21b1d2d020da0eafe   d21b      -46
92  1.566661e+12       dd1e1e16121e000082   dd1e      -35
93  1.566661e+12 d1b1050000000078607917ef   d1b1        0
94  1.566661e+12 d2b1115e796978000000004c   d2b1        0
95  1.566661e+12 82b11638575a103c020164e5   82b1        0
96  1.566661e+12 81b11b7277723d3d3d3d3cd8   81b1        0
97  1.566661e+12 d1b100000f000078607917f9   d1b1        0
98  1.566661e+12 86b100000000000000000037   86b1        0
99  1.566661e+12 84b18c5a505064780006009d   84b1        0
100 1.566661e+12 85b142064a1600080000cdb3   85b1        0
>

Go Up