Bonjour à toutes et à tous,

N'étant pas un profesionnel de python (et de la programmation en général) je me tourne vers vous pour quelque conseil !

Tout d'abord, laissez moi vous expliquer un peu le contexte.

La 1ere partie du script, que je ne vous détaillerez pas pour la simple raison qu'elle fonctionne correctement, envoie une commande sous forme d'une chaîne de caractère hexadécimal à un boitier physique, ce boitier répond à son tour. cette réponse est sous cette forme : "ACK0p08000200F060010000"
Ces caractères hexadécimal correspondent chacun à une information contenu dans un fichier de mapping(mapfile.txt) dont voici la forme:
bit 0-15 | Project_id | RMC
bit 53 | SSPA-A | RMC
bitnumber | information | type de boitier

Chaque information est enregistrée sur 1 ou plusieurs bit, ici en l'occurence, l'information project_id est enregistrée sur 16 bit et SSPA-A est enregistrée seulement sur le bit numéro 53.
A noté que la conversation de l'hexa au binaire est ici un peu particulière, car ce sont seulement des demi octets, c'est à dire que par exemple, l'information présente au "demi"octet numéro 13 est 13* 4 = 52 > 52eme bit !
Dans l'exemple d'au dessus, dans le demi octet numéro 13, il y a donc 4 bit avec chacun une information différente, le bit 52 correpond par exemple à la température, le 53 au status du boitier, le 54 ...

Le code qui suit à des variables défini en dur pour éviter toute la 1ere partie.

Voici donc le code, ça sera surement plus compréhensible

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
# On ouvre le fichier de mapping passé en paramètre
msg = 'ACK0p08000200F060010000'
# la variable "data" enlève la 1ere partie de la chaine qui nous sera inutile et prend donc  seulement 08000200F060010000, je la transforme ensuite en nombre entier hexadécimal
data = int(msg[5:],16)
print ('\nNombre entier hexadécimal, on le traduit en binaire en isolant le numéro de bit :\n ' + str(data))
#ici se
zabbix = [line.strip() for line in open('mapfileRMC.txt','r')]
# On extrait ligne par ligne, le numéro de bit, la clé d'item, et le type de statut
for line in zabbix:
    # J'essaie de récupérer les chiffres / lettres contenu dans le fichier avec une expression régulière
    result = re.search('bit\s([0-9]+)|([0-9]+)-([0-9]+)\s\|\s([a-zA-Z]*)\s\|\s([a-zA-Z]*)', line)
    if result:
      # On extrait le contenu de chaque ligne  
      bitnumber = result.group(1)
      itemZabbix = result.group(2)
      typeboitier = result.group(3)
 
      # On génere le masque binaire associé au numéro de bit 
      # ici on essaie d'isoler le numéro de bit, et masquer pour pourvoir ressortir seulement l'information dont on a besoin
      mask = "1"
      for i in range(0,int(bitnumber)):
        mask += "0"   
 
      binarymask = int(mask,2)
      print ('\nMasque binaire : ' + str(binarymask))
      # On masque la valeur et on décale pour obtenir la valeur du bit
      bitvalue = (data & binarymask)>>int(bitnumber)
 
      print('\nValeur du bit' + str(bitvalue))
      print('Item zabbix' + str(itemZabbix))
      print('typeboitier ' + str(typeBoitier))
En tous les cas, voici ce que donne l'exécution du script :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Nombre entier hexadécimal, on le traduit en binaire en isolant le numéro de bit :
 147574516572032663552
 
Masque binaire : 1
 
Valeur du bit0
Item zabbixNone
typeboitierNone
 
Masque binaire : 65536
 
Valeur du bit1
Item zabbixNone
typeboitierNone
 
Masque binaire : 4294967296
 
Valeur du bit0
Item zabbixNone
typeboitierNone
 
Masque binaire : 8589934592
 
Valeur du bit0
Item zabbixNone
typeboitierNone
j'ai coupé car ça descend encore plus bas.

Pour résumé, je n'arrive pas à voir si le code que j'ai fais, prend en compte n'importe quel informations > bitnumber = n et ressort la bonne information associé à ce numéro de bit.

Si vous avez des remarques quant au python en lui même, je suis également preneur.

Je ne pense pas que ça soit très clair, je répondrai aux éventuelles questions du mieux possible.

Merci pour vos réponses.

Cordialement,

Lysan