diff --git a/teleinfo.py b/teleinfo.py index 87467a7..fcd204a 100644 --- a/teleinfo.py +++ b/teleinfo.py @@ -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()