Merge pull request #7 from Charlymd/checksum

ajout de la fonction de calcul du checksum
This commit is contained in:
SebastienReuiller 2021-12-14 22:52:11 +01:00 committed by GitHub
commit 9df0308204
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -7,11 +7,12 @@
#
# Exemple de trame:
# {
# 'OPTARIF': 'HC..', # option tarifaire
# 'IMAX': '007', # intensité max
# 'HCHC': '040177099', # index heure creuse en Wh
# 'BASE': '123456789' # Index heure de base en Wh
# 'OPTARIF': 'HC..', # Option tarifaire HC/BASE
# 'IMAX': '007', # Intensité max
# 'HCHC': '040177099', # Index heure creuse en Wh
# 'IINST': '005', # Intensité instantanée en A
# 'PAPP': '01289', # puissance Apparente, en VA
# 'PAPP': '01289', # Puissance Apparente, en VA
# 'MOTDETAT': '000000', # Mot d'état du compteur
# 'HHPHC': 'A', # Horaire Heures Pleines Heures Creuses
# 'ISOUSC': '45', # Intensité souscrite en A
@ -29,7 +30,8 @@ from datetime import datetime
from influxdb import InfluxDBClient
# clés téléinfo
int_measure_keys = ['IMAX', 'HCHC', 'IINST', 'PAPP', 'ISOUSC', 'ADCO', 'HCHP']
int_measure_keys = ['BASE','IMAX', 'HCHC', 'IINST', 'PAPP', 'ISOUSC', 'ADCO', 'HCHP']
no_checksum = ['MOTDETAT']
# création du logguer
logging.basicConfig(filename='/var/log/teleinfo/releve.log', level=logging.INFO, format='%(asctime)s %(message)s')
@ -61,6 +63,7 @@ def add_measures(measures, time_measure):
point = {
"measurement": measure,
"tags": {
# identification de la sonde et du compteur
"host": "raspberry",
"region": "linky"
},
@ -74,6 +77,18 @@ def add_measures(measures, time_measure):
client.write_points(points)
def verif_checksum(data,checksum):
data_unicode = 0
for caractere in data:
data_unicode += ord(caractere)
sum_unicode = (data_unicode & 63) + 32
sum = chr(sum_unicode)
if (checksum == sum):
return True
else:
return False
def main():
with serial.Serial(port='/dev/ttyS0', baudrate=1200, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE,
bytesize=serial.SEVENBITS, timeout=1) as ser:
@ -92,22 +107,30 @@ def main():
while True:
line_str = line.decode("utf-8")
ar = line_str.split(" ")
logging.debug(line)
ar = line_str.split(" ") # separation sur espace /!\ attention le caractere de controle 0x32 est un espace aussi
# preparation données pour verification checksum
data = ar[0] + " " + ar[1]
checksum = (line_str.replace('\x03\x02',''))[-3:-2] # supprimer les retours charriot et saut de ligne puis selectionne le caractere de controle en partant de la fin
verif_checksum(data,checksum)
try:
key = ar[0]
if key in int_measure_keys :
if key in int_measure_keys : # typer les valeurs numériques en "integer"
value = int(ar[1])
else:
value = ar[1]
checksum = ar[2]
trame[key] = value
value = ar[1] # typer les autres valeurs en "string"
trame[key] = value # creation du champ pour la trame en cours
if b'\x03' in line: # si caractère de fin dans la ligne, on insère la trame dans influx
del trame['ADCO'] # adresse du compteur : confidentiel!
time_measure = time.time()
# insertion dans influxdb
add_measures(trame, time_measure)
if (verif_checksum) :
add_measures(trame, time_measure)
# ajout timestamp pour debugger
trame["timestamp"] = int(time_measure)
@ -115,7 +138,8 @@ def main():
trame = dict() # on repart sur une nouvelle trame
except Exception as e:
logging.error("Exception : %s" % e)
logging.error("Exception : %s" % e, exc_info=True)
logging.error("%s %s" % (key,value))
line = ser.readline()