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