@@ -1,113 +1,126 | |||
|
1 | 1 | import paho.mqtt.client as mqtt |
|
2 | from datetime import datetime | |
|
2 | import paho.mqtt.publish as publish | |
|
3 | from datetime import datetime, timezone, timedelta | |
|
3 | 4 | import numpy as np |
|
4 | 5 | import json |
|
5 | 6 | import time |
|
6 |
subscribe_topic="tesis/ |
|
|
7 |
publish_topic=" |
|
|
8 |
broker_address = " |
|
|
9 | analogRawMatriz=[[],[],[],[],[],[],[],[]] | |
|
10 | numMaxdatos=1000 | |
|
7 | subscribe_topic="tesis/analogRaw" | |
|
8 | publish_topic="atrad/test3"#"tesis/potencia" | |
|
9 | broker_address = "10.10.10.102"#10.10.10.102"#"192.168.43.149" | |
|
10 | analogRawMatriz=[[],[],[],[],[],[],[],[]]#guardamos los valores del | |
|
11 | numMaxdatos=1000 #definimos el numero máximo de datos a promediar | |
|
11 | 12 | contador = 0 |
|
12 | data=[] | |
|
13 | 13 | interval_start_time = time.time() |
|
14 |
interval_duration= |
|
|
14 | interval_duration=30 #duracion del intervalo (en segundos) para el envio de datos | |
|
15 | 15 | def potenciaAncho10us(AnalogRaw): |
|
16 | 16 | potencia=[0,0,0,0,0,0,0,0] |
|
17 | 17 | m=1.5476 |
|
18 | 18 | b=-91.898 |
|
19 | 19 | for i in range(8): |
|
20 | 20 | potencia[i]=m*AnalogRaw[i]+b |
|
21 | 21 | return potencia |
|
22 | 22 | |
|
23 | 23 | def potenciaAncho20us(AnalogRaw): |
|
24 | 24 | potencia=[0,0,0,0,0,0,0,0] |
|
25 |
m= |
|
|
26 |
b= |
|
|
25 | m=0.6233 | |
|
26 | b=62.891 | |
|
27 | 27 | for i in range(8): |
|
28 | 28 | potencia[i]=m*AnalogRaw[i]+b |
|
29 | 29 | return potencia |
|
30 | #la potencia default considera en general valores mayores a 100 us | |
|
31 | def potenciaDefault(AnalogRaw): | |
|
32 | potencia=[0,0,0,0,0,0,0,0] | |
|
33 | m=0.6233 | |
|
34 | b=62.891 | |
|
35 | for i in range(8): | |
|
36 | potencia[i]=m*AnalogRaw[i]+b | |
|
37 | return potencia | |
|
38 | ||
|
30 | 39 | |
|
31 | 40 | def leer_datos_desde_txt(archivo): |
|
32 | 41 | try: |
|
33 | 42 | with open(archivo, 'r') as file: |
|
34 | 43 | lineas = file.readlines() |
|
35 | 44 | # Obtiene la segunda línea (índice 1) |
|
36 | 45 | segunda_linea = lineas[1] |
|
37 | 46 | datos = segunda_linea.strip().split() |
|
38 | 47 | datos_numericos = [float(dato) for dato in datos] |
|
39 | 48 | return datos_numericos |
|
40 | 49 | except FileNotFoundError: |
|
41 | 50 | print(f"El archivo '{archivo}' no fue encontrado.") |
|
42 | 51 | except Exception as e: |
|
43 | 52 | print(f"Error al leer el archivo: {e}") |
|
44 | 53 | |
|
45 | 54 | def procesamiento_data(analogRawMatriz): |
|
46 | 55 | if analogRawMatriz[0]: |
|
47 | 56 | average_raw=[0,0,0,0,0,0,0,0,0] |
|
48 | 57 | for i in range(8): |
|
49 | 58 | average_raw[i] = sum(analogRawMatriz[i]) / len(analogRawMatriz[i]) |
|
50 | 59 | if(ancho<15): |
|
51 | 60 | potencia=potenciaAncho10us(average_raw) |
|
52 | 61 | if ancho>15 and ancho<25: |
|
53 | 62 | potencia=potenciaAncho20us(average_raw) |
|
54 | processed_data = {"Ancho_us":IPP,"average_potencia": potencia, "timestamp": datetime.now()} | |
|
55 | #client.publish(publish_topic, json.dumps(processed_data)) | |
|
63 | timestamp_actual = int(time.time()) | |
|
64 | fecha_utc=datetime.utcfromtimestamp(timestamp_actual) | |
|
65 | zona_horaria_utc_menos_5 = timezone(timedelta(hours=-5)) | |
|
66 | fecha_utc_menos_5 = fecha_utc.replace(tzinfo=timezone.utc).astimezone(zona_horaria_utc_menos_5) | |
|
67 | fecha_legible=fecha_utc_menos_5.strftime('%d-%m-%Y %H:%M:%S') | |
|
68 | estado=[1 if x > 0 else 0 for x in potenciaNominal] | |
|
69 | processed_data = {"Ancho_us":IPP,"average_potencia": potencia, "timestamp": fecha_legible,"potenciaNominal":potenciaNominal,"estado":estado} | |
|
70 | client.publish(publish_topic, json.dumps(processed_data)) | |
|
56 | 71 | print("---------------------------------------") |
|
57 | 72 | print(average_raw) |
|
58 | 73 | print(processed_data) |
|
74 | print(type(processed_data["average_potencia"])) | |
|
59 | 75 | |
|
60 | 76 | def on_connect(client, userdata, flags, rc): |
|
61 | 77 | if rc == 0: |
|
62 | 78 | print("Conexión exitosa con el broker") |
|
63 | 79 | client.subscribe(subscribe_topic) |
|
64 | 80 | else: |
|
65 | 81 | print("Error de conexión. Código de retorno =", rc) |
|
66 | 82 | # Callback cuando se recibe un mensaje en el tópico suscrito |
|
67 | 83 | def on_message(client, userdata, msg): |
|
68 | 84 | global analogRawMatriz |
|
69 | 85 | global contador |
|
70 | 86 | mensaje = msg.payload.decode() |
|
71 | 87 | lista=json.loads(mensaje) |
|
72 | 88 | if contador<numMaxdatos: |
|
73 | 89 | for i in range(8): |
|
74 | 90 | analogRawMatriz[i].append(lista[i]) |
|
75 | 91 | contador=contador+1 |
|
76 | #Leo los datos de la configuracion | |
|
92 | #Leo los datos de la configuracion y halla el ancho | |
|
77 | 93 | archivo_txt = 'commandPotencia.txt' |
|
78 | 94 | datos_numericos = leer_datos_desde_txt(archivo_txt) |
|
79 | 95 | if len(datos_numericos)!=10: |
|
80 | 96 | print("Hay más(o menos) valores de los que debería") |
|
81 | 97 | else: |
|
82 | 98 | IPP_km=datos_numericos[0] |
|
83 | 99 | IPP=IPP_km*1/150#IPP en ms |
|
84 | 100 | Dutty=datos_numericos[1] |
|
85 | 101 | ancho=IPP*Dutty*pow(10,3)/100 |
|
86 | 102 | potenciaNominal=datos_numericos[2:] |
|
87 | ||
|
88 | 103 | # Configurar el cliente MQTT |
|
89 | 104 | client = mqtt.Client() |
|
90 | 105 | # Configurar los callbacks |
|
91 | 106 | client.on_connect = on_connect |
|
92 | 107 | client.on_message = on_message |
|
93 | 108 | client.connect(broker_address, port=1883, keepalive=60) |
|
94 | #client.loop_forever() | |
|
95 | 109 | |
|
96 | 110 | client.loop_start() |
|
97 | 111 | try: |
|
98 | 112 | while True: |
|
99 | 113 | # Verifica si ha pasado el intervalo de tiempo |
|
100 | 114 | current_time = time.time() |
|
101 | 115 | elapsed_time = current_time - interval_start_time |
|
102 | 116 | if elapsed_time >= interval_duration: |
|
103 |
procesamiento_data(analogRawMatriz) # Calcula la potencia y envía los datos |
|
|
117 | procesamiento_data(analogRawMatriz) # Calcula la potencia y envía los datos | |
|
104 | 118 | interval_start_time = current_time # Reinicia el temporizador del intervalo |
|
105 | 119 | analogRawMatriz=[[],[],[],[],[],[],[],[]] |
|
106 | # Puedes ajustar el tiempo de espera según tus necesidades | |
|
107 | 120 | time.sleep(1) |
|
108 | 121 | |
|
109 | 122 | except KeyboardInterrupt: |
|
110 | 123 | print("Programa detenido por el usuario.") |
|
111 | #procesamiento_data() # Asegúrate de enviar los datos acumulados antes de salir | |
|
112 | 124 | client.disconnect() |
|
113 | 125 | client.loop_stop() |
|
126 | #client.loop_forever() No newline at end of file |
General Comments 0
You need to be logged in to leave comments.
Login now