##// END OF EJS Templates
Se agrego el threshold...
JesusTapia-dev -
r20:96b1842fbedf schottkyExp
parent child
Show More
@@ -1,2 +1,2
1 IPP(km) DutyCicle(%) Wu Wd Nd Nu Eu Ed Sd Su
1 IPP(km) DutyCicle(%) threshold(%) Wu Wd Nd Nu Eu Ed Sd Su
2 1500 0.1 250 0 0 0 0 0 200 200 No newline at end of file
2 1500 0.1 10 250 0 0 0 0 0 200 200 No newline at end of file
@@ -1,125 +1,126
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 def leer_datos_desde_txt(archivo):
39 def leer_datos_desde_txt(archivo):
40 try:
40 try:
41 with open(archivo, 'r') as file:
41 with open(archivo, 'r') as file:
42 lineas = file.readlines()
42 lineas = file.readlines()
43 # Obtiene la segunda línea (índice 1)
43 # Obtiene la segunda línea (índice 1)
44 segunda_linea = lineas[1]
44 segunda_linea = lineas[1]
45 datos = segunda_linea.strip().split()
45 datos = segunda_linea.strip().split()
46 datos_numericos = [float(dato) for dato in datos]
46 datos_numericos = [float(dato) for dato in datos]
47 return datos_numericos
47 return datos_numericos
48 except FileNotFoundError:
48 except FileNotFoundError:
49 print(f"El archivo '{archivo}' no fue encontrado.")
49 print(f"El archivo '{archivo}' no fue encontrado.")
50 except Exception as e:
50 except Exception as e:
51 print(f"Error al leer el archivo: {e}")
51 print(f"Error al leer el archivo: {e}")
52
52
53 def procesamiento_data(analogRawMatriz):
53 def procesamiento_data(analogRawMatriz):
54 if analogRawMatriz[0]:
54 if analogRawMatriz[0]:
55 average_raw=[0,0,0,0,0,0,0,0]
55 average_raw=[0,0,0,0,0,0,0,0]
56 for i in range(8):
56 for i in range(8):
57 average_raw[i] = sum(analogRawMatriz[i]) / len(analogRawMatriz[i])
57 average_raw[i] = sum(analogRawMatriz[i]) / len(analogRawMatriz[i])
58 if(ancho<15):
58 if(ancho<15):
59 potencia=potenciaAncho10us(average_raw)
59 potencia=potenciaAncho10us(average_raw)
60 if ancho>15 and ancho<25:
60 if ancho>15 and ancho<25:
61 potencia=potenciaAncho20us(average_raw)
61 potencia=potenciaAncho20us(average_raw)
62 timestamp_actual = int(time.time())
62 timestamp_actual = int(time.time())
63 fecha_utc=datetime.utcfromtimestamp(timestamp_actual)
63 fecha_utc=datetime.utcfromtimestamp(timestamp_actual)
64 zona_horaria_utc_menos_5 = timezone(timedelta(hours=-5))
64 zona_horaria_utc_menos_5 = timezone(timedelta(hours=-5))
65 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)
66 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')
67 estado=[1 if x > 0 else 0 for x in potenciaNominal]
67 estado=[1 if x > 0 else 0 for x in potenciaNominal]
68 processed_data = {"Ancho_us":IPP,"pow": potencia, "time": fecha_legible,"potenciaNominal":potenciaNominal,"status":estado}
68 processed_data = {"Ancho_us":IPP,"pow": potencia, "time": fecha_legible,"potenciaNominal":potenciaNominal,"status":estado,"threshold":threshold}
69 client.publish(publish_topic, json.dumps(processed_data))
69 client.publish(publish_topic, json.dumps(processed_data))
70 print("---------------------------------------")
70 print("---------------------------------------")
71 print(average_raw)
71 print(average_raw)
72 print(processed_data)
72 print(processed_data)
73 print(type(processed_data["pow"]))
73 print(type(processed_data["pow"]))
74
74
75 def on_connect(client, userdata, flags, rc):
75 def on_connect(client, userdata, flags, rc):
76 if rc == 0:
76 if rc == 0:
77 print("Conexión exitosa con el broker")
77 print("Conexión exitosa con el broker")
78 client.subscribe(subscribe_topic)
78 client.subscribe(subscribe_topic)
79 else:
79 else:
80 print("Error de conexión. Código de retorno =", rc)
80 print("Error de conexión. Código de retorno =", rc)
81 # Callback cuando se recibe un mensaje en el tópico suscrito
81 # Callback cuando se recibe un mensaje en el tópico suscrito
82 def on_message(client, userdata, msg):
82 def on_message(client, userdata, msg):
83 global analogRawMatriz
83 global analogRawMatriz
84 global contador
84 global contador
85 mensaje = msg.payload.decode()
85 mensaje = msg.payload.decode()
86 lista=json.loads(mensaje)
86 lista=json.loads(mensaje)
87 if contador<numMaxdatos:
87 if contador<numMaxdatos:
88 for i in range(8):
88 for i in range(8):
89 analogRawMatriz[i].append(lista[i])
89 analogRawMatriz[i].append(lista[i])
90 contador=contador+1
90 contador=contador+1
91 #Leo los datos de la configuracion y halla el ancho
91 #Leo los datos de la configuracion y halla el ancho
92 archivo_txt = 'commandPotencia.txt'
92 archivo_txt = 'commandPotencia.txt'
93 datos_numericos = leer_datos_desde_txt(archivo_txt)
93 datos_numericos = leer_datos_desde_txt(archivo_txt)
94 if len(datos_numericos)!=10:
94 if len(datos_numericos)!=11:
95 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")
96 else:
96 else:
97 IPP_km=datos_numericos[0]
97 IPP_km=datos_numericos[0]
98 IPP=IPP_km*1/150#IPP en ms
98 IPP=IPP_km*1/150#IPP en ms
99 Dutty=datos_numericos[1]
99 Dutty=datos_numericos[1]
100 threshold=datos_numericos[2]
100 ancho=IPP*Dutty*pow(10,3)/100
101 ancho=IPP*Dutty*pow(10,3)/100
101 potenciaNominal=datos_numericos[2:]
102 potenciaNominal=datos_numericos[3:]
102 # Configurar el cliente MQTT
103 # Configurar el cliente MQTT
103 client = mqtt.Client()
104 client = mqtt.Client()
104 # Configurar los callbacks
105 # Configurar los callbacks
105 client.on_connect = on_connect
106 client.on_connect = on_connect
106 client.on_message = on_message
107 client.on_message = on_message
107 client.connect(broker_address, port=1883, keepalive=60)
108 client.connect(broker_address, port=1883, keepalive=60)
108
109
109 client.loop_start()
110 client.loop_start()
110 try:
111 try:
111 while True:
112 while True:
112 # Verifica si ha pasado el intervalo de tiempo
113 # Verifica si ha pasado el intervalo de tiempo
113 current_time = time.time()
114 current_time = time.time()
114 elapsed_time = current_time - interval_start_time
115 elapsed_time = current_time - interval_start_time
115 if elapsed_time >= interval_duration:
116 if elapsed_time >= interval_duration:
116 procesamiento_data(analogRawMatriz) # Calcula la potencia y envía los datos
117 procesamiento_data(analogRawMatriz) # Calcula la potencia y envía los datos
117 interval_start_time = current_time # Reinicia el temporizador del intervalo
118 interval_start_time = current_time # Reinicia el temporizador del intervalo
118 analogRawMatriz=[[],[],[],[],[],[],[],[]]
119 analogRawMatriz=[[],[],[],[],[],[],[],[]]
119 time.sleep(1)
120 time.sleep(1)
120
121
121 except KeyboardInterrupt:
122 except KeyboardInterrupt:
122 print("Programa detenido por el usuario.")
123 print("Programa detenido por el usuario.")
123 client.disconnect()
124 client.disconnect()
124 client.loop_stop()
125 client.loop_stop()
125 #client.loop_forever() No newline at end of file
126 #client.loop_forever()
General Comments 0
You need to be logged in to leave comments. Login now