Files
2023-04-30 20:16:33 +02:00

118 lines
4.3 KiB
Python
Executable File

#!/usr/bin/python
# -*- coding: utf-8 -*-
# Pour lire le .ini
import configparser
import json
import subprocess
# Pour faire des sleep
import time
# Pour la date
from datetime import datetime
# Pour le debug
import pprint
import csv
import os.path
import random
# ~ import RPi.GPIO as GPIO
# ~ GPIO.setmode(GPIO.BCM)
# ~ gpio_number = 25
# ~ GPIO.setup(gpio_number, GPIO.OUT)
# ~ print("GPIO no " + str(gpio_number) + ": " + str(GPIO.input(gpio_number)))
# On charge le config.ini
config = configparser.RawConfigParser() # On créé un nouvel objet "config"
config.read('config.ini') # On lit le fichier de paramètres
csvfile=config.get('general', 'csv_dir').strip('"') + '/' + time.strftime ('%Y-%m-%d_%H-%M') + '.csv'
if (os.path.exists(csvfile)) :
csvfile=config.get('general', 'csv_dir').strip('"') + '/' + time.strftime ('%Y-%m-%d_%H-%M') + str(random.randint(1, 100)) + '.csv'
print('#############################################################################')
print('######## Banc AFPMA ECS / Aquisition des mesures')
print('#############################################################################')
print()
print('La configuration (config.ini) détermine : ')
print(' * que le fichier csv de relevé est : ',csvfile)
print(' * que l\'interval entre 2 mesures sera de ', int(config.get('general', 'delai')), 'secondes')
print()
# Init colonne CSV
with open(csvfile, 'w', newline='') as fichier:
# on déclare un objet writer
ecrivain = csv.writer(fichier)
# écrire une ligne dans le fichier:
ecrivain.writerow(['T', 'DATE', 'ENERGY_WH', 'VOLUME_FLOW', 'POWER_W', 'FLOW_TEMPERATURE', 'RETURN_TEMPERATURE'])
fin = False
now = datetime.now()
chronoDepart=datetime.timestamp(now)
prochainReleve=chronoDepart
while fin == False:
now = datetime.now()
nowTimestamp=datetime.timestamp(now)
if (nowTimestamp >= prochainReleve):
print("Relevé " + str(now))
prochainReleve=nowTimestamp+float(config.get('general', 'delai'))
dt_string = now.strftime("%d/%m/%Y %H:%M:%S")
temps_sec=round(datetime.timestamp(now)-chronoDepart, 0)
data = [temps_sec, dt_string]
print('T='+str(temps_sec), end=" ")
print('DATE='+str(dt_string), end=" ")
## Récupérer les données :
result = subprocess.Popen(["/usr/bin/python3", "/opt/banc/mbus-serial-request-data.py", "/dev/ttyAMA0"], stdout=subprocess.PIPE)
result_request_data = result.communicate()[0]
return_code = result.returncode
try:
#convert string to object
request_data_object = json.loads(result_request_data)
except ValueError:
return_code = 255
if (return_code == 0):
## Parse des données
for records in request_data_object['body']['records']:
if (records['type'] == 'VIFUnit.ENERGY_WH'):
try:
if (records['device'] != None):
# On ne récupère pas si le device est rensigné
pass
except KeyError as ke:
print('ENERGY_WH='+str(round(records['value'], 2)), end=" ")
data.append(round(records['value'], 2))
elif (records['type'] == 'VIFUnit.VOLUME_FLOW'):
print('VOLUME_FLOW='+str(round(records['value'], 2)), end=" ")
data.append(round(records['value'], 2))
elif (records['type'] == 'VIFUnit.POWER_W'):
print('POWER_W='+str(round(records['value'], 2)), end=" ")
data.append(round(records['value'], 2))
elif (records['type'] == 'VIFUnit.FLOW_TEMPERATURE'):
print('FLOW_TEMPERATURE='+str(round(records['value'], 2)), end=" ")
data.append(round(records['value'], 2))
elif (records['type'] == 'VIFUnit.RETURN_TEMPERATURE'):
print('RETURN_TEMPERATURE='+str(round(records['value'], 2)), end=" ")
data.append(round(records['value'], 2))
print("");
else:
print('Erreur : aucune communicatoin avec le compteur d\'énergie')
data.append('Erreur')
data.append('Erreur')
data.append('Erreur')
data.append('Erreur')
data.append('Erreur')
# ouverture en écriture (w, première lettre de write) d'un fichier
with open(csvfile, 'a', newline='') as fichier:
# on déclare un objet writer
ecrivain = csv.writer(fichier)
# écrire une ligne dans le fichier:
ecrivain.writerow(data)
print('... Fin de la mesure, on patiente', int(config.get('general', 'delai')), 's')
print('... Pour quiter, appuyer sur CTRL + C')
print("");
time.sleep(float(config.get('general', 'sleep')))