Resultados 426 al 450 de 1294
- 07/08/2016, 17:07 #426
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
He probado mil formas diferentes y no va, asignando una tabla a la otra, dentro del programa. En otro abierto para dicho fin sí, como puede verse en la imagen anterior.
Ok, ya he modificado la creación de las matrices inicializando el contenido a 0.
También he cambiado una condición '<' que estaba al revés, cosas del copy&paste.
- - - - - - - - - - - - - - - - - - -
Hemos dado un gran paso.
Tal como mencionabas en posts anteriores, y visto el resultado del print():
Código PHP:...
Apagar reles
Apagar reles
Encender rele (direccion,puerto)= 0 0 # direccion 32, rele1 (1 de 8)
Encender rele (direccion,puerto)= 0 1 # direccion 32, rele2 (2 de 8)
-------------
Hay que definir número de integrados PCF8574P para que no pete el programa:
Código PHP:### Definir matrices Rele_Out y Rele_Out_Ant y apagar todos los reles
Rele_Out = [[0] * 8 for i in range(8)]
Rele_Out_Ant = [[0] * 8 for i in range(8)]
for I in range(1) : #numero de integrados instalados <= SOLUCION: NUMERO DE INTEGRADOS
for J in range(8) :
#Rele_Out[I][J] = 0
#Rele_Out_Ant[I][J] = 0
i2c_rele(I+32,J+1,0)
Última edición por nikitto; 07/08/2016 a las 17:37
PvControl+: Control sistema fotovoltaico
Si te gusta la web, aquí el proyecto. El manual está aquí
¿Cómo conectar un Axpert a una Raspberry? Aquí
¿Cómo conectar un InfiniSolar a una Raspberry? Aquí
-
- 07/08/2016, 22:52 #427
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Esto ya está funcionando. Para ello he sacado la parte de la lectura de las tablas fuera del bucle.
Mientras no tenemos implementación del estado de los relés vía web, he escrito este programa para saber su estado:
Código PHP:from smbus import SMBus
bus = SMBus(1)
a= bus.read_byte(0x20)
if a== 254 :
print ('Rele1-ON')
print ('Rele2-OFF')
elif a== 253:
print ('Rele1-OFF')
print ('Rele2-ON')
elif a== 252:
print ('Rele1-ON')
print ('Rele2-ON')
else:
print ('Rele1-OFF')
print ('Rele2-OFF')
Código PHP:nikitto@asako ~/FV $ python estado_reles.py
Rele1_OFF
Rele2-ON
Última edición por nikitto; 07/08/2016 a las 23:33
PvControl+: Control sistema fotovoltaico
Si te gusta la web, aquí el proyecto. El manual está aquí
¿Cómo conectar un Axpert a una Raspberry? Aquí
¿Cómo conectar un InfiniSolar a una Raspberry? Aquí
- 08/08/2016, 05:38 #428
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Dado que me he instalado Python y estan los Juegos Olimpicos...he hecho unas pruebas de verificacion del codigo mientras veia las pruebas deportivas
Tambien he cambiado alguna cosilla:
-La forma de asignar Rele_Out_Ant a Rele_Out....Dado que es cierto que no funciona la asignación directa, me pique con no utilizar un doble bucle.
- Ya he puesto un algoritmo para solo encender 1 rele en cada muestra
Como no tengo BD mi algoritmo lo simula
Igualmente no incorporo las sentencias I2C para encender/apagar realmente los reles
No lo he pensado mucho...pero no veo la necesidad de decir por programa los integrados que realmente se tienen instalados
Con todo esto....aquí el código que me sale :
Código PHP:# ------------------ INICIO PROGRAMA --------------------
#import MySQLdb # Quitar comentario en sistema con BD Mysql
DatosFV={} #Creamos diccionario para guardar los datos FV de cada muestra
#Diccionario para tablas condiciones Reles
OP={'id_rele':0,'nombre':1,'modo':2,'id_rele2':3,'operacion':4,'parametro':5,'condicion':6,'valor':7}
### Definir matrices Rele_Out y Rele_Out_Ant y apagar todos los reles
Rele_Out = [[0] * 8 for i in range(8)]
Rele_Out_Ant = [[0] * 8 for i in range(8)]
print("Matrices Rele_Out inicializadas a 0")
for I in range(8) :
for J in range(8) :
J=J #Utilizar funcion I2C_Rele para apagar todos los reles
#--------Lectura BD de las tablas condiciones RELES -------------
# Dado que no esta en el bucle principal la lectura de las tablas de condiciones,
# hay que asegurar que cuando se actualicen las condiciones via web se actualice
# tambien la matriz R y la variable ncon
# Si se pone en el bucle principal, es mas facil, pero hay que ver rendimiento
# reles = MySQLdb.connect(host = "localhost", user = "fv", passwd = "fv", db = "fv")
# cursor = reles.cursor()
# sql_reles='SELECT * FROM reles JOIN reles_c WHERE reles.id_rele = reles_c.id_rele'
# ncon=cursor.execute(sql_reles)
# ncon=int(ncon)
# R=cursor.fetchall()
#Simulo lectura de las tablas de condiciones de la BD
R= [[321,"Termo","PRG",321,"ON","Vbat",">",26],[332,"Depuradora","PRG",332,"ON","Vbat",">",25],
[321,"Termo","PRG",321,"OFF","Vbat","<",24],[332,"Depuradora","PRG",332,"OFF","Vbat","<",23],
[321,"Termo","PRG",321,"ON","SOC",">",90],[332,"Depuradora","PRG",332,"ON","SOC",">",85],
[321,"Termo","PRG",321,"OFF","SOC","<",85],[332,"Depuradora","PRG",332,"OFF","SOC","<",80]]
ncon=8 #Nº de registros condiciones........
print("Tabla de condiciones")
print (R)
print()
# ------------------ BUCLE PRINCIPAL --------------------
#En lugar de un bucle indefinido simulo unas muestras de Vbat y SOC
for x in [22,99],[22,50],[27,89],[27,84],[27,92],[23.5,92],[23.5,79],[27,95],[27,95],[22,95]:
DatosFV['Vbat']=x[0]
DatosFV['SOC']=x[1]
#-------------------------------------
# Guardar en BD las muestras obtenidas
#-------------------------------------
#-------Algoritmo condiciones reles------------
Rele_Out_Ant = [i[:] for i in Rele_Out] #Guardo el estado anterior de los reles
print("Situacion Rele_Out y Rele_Out_Ant antes algoritmo cuando Vbat=", DatosFV['Vbat'], " SOC=",DatosFV['SOC'])
print (Rele_Out_Ant)
print()
for I in range(ncon):
Puerto=(R[I][0]%10)-1 # desde 0 a 7
GR=int((R[I][0]-Puerto)/10)-32 # desde 0 donde GR=0 si id_rele=32X, GR=1 si id_rele=33X
Rele_Out[GR][Puerto]=1 #encendemos virtualmente todos los reles por defecto
print ("Ejecutando bucle condiciones")
print()
for I in range(ncon):
Puerto=(R[I][0]%10)-1 # desde 0 a 7
GR=int((R[I][0]-Puerto)/10)-32 # desde 0 donde GR=0 si id_rele=32X, GR=1 si id_rele=33X,....
if R[I][OP['condicion']]=='<':
if R[I][OP['operacion']]=='ON' and DatosFV[R[I][OP['parametro']]] > R[I][OP['valor']] and Rele_Out_Ant[GR][Puerto] == 0 :
Rele_Out[GR][Puerto]=0
if R[I][OP['operacion']]=='OFF' and DatosFV[R[I][OP['parametro']]] < R[I][OP['valor']] :
Rele_Out[GR][Puerto]=0
if R[I][OP['condicion']]=='>':
if R[I][OP['operacion']]=='ON' and DatosFV[R[I][OP['parametro']]] < R[I][OP['valor']] and Rele_Out_Ant[GR][Puerto] == 0 :
Rele_Out[GR][Puerto]=0
if R[I][OP['operacion']]=='OFF' and DatosFV[R[I][OP['parametro']]] > R[I][OP['valor']] :
Rele_Out[GR][Puerto]=0
### Forzado ON/OFF
if R[I][OP['modo']]=='ON' :
Rele_Out[GR][Puerto]=1
if R[I][OP['modo']]=='OFF' :
Rele_Out[GR][Puerto]=0
# Bucle encendido/apagado reles
Flag_Rele_Encendido=0 #Flag para encender un unico rele cada muestra
for I in range(8):
for J in range(8):
if Rele_Out[I][J] == 1 and Rele_Out_Ant[I][J] == 0 and Flag_Rele_Encendido==1:
print("No Encendiendo rele =",I,J) #No encender rele
Rele_Out[I][J] = 0
if Rele_Out[I][J] == 1 and Rele_Out_Ant[I][J] == 0 and Flag_Rele_Encendido==0:
print("Encendiendo rele =",I,J) #encender rele
Flag_Rele_Encendido=1
if Rele_Out[I][J] == 0 and Rele_Out_Ant[I][J] == 1 :
print("Apagando rele =",I,J) #apagar rele
print()
print("Situacion Rele_Out despues cuando Vbat=", DatosFV['Vbat']," SOC=",DatosFV['SOC'])
print (Rele_Out)
print("-------------------------------------------")
Si se ejecuta..... con las condiciones que he dado de alta y los valores Vbat y SOC que simulo tengo este resultado
Código PHP:Matrices Rele_Out inicializadas a 0
Tabla de condiciones
[[321, 'Termo', 'PRG', 321, 'ON', 'Vbat', '>', 26], [332, 'Depuradora', 'PRG', 332, 'ON', 'Vbat', '>', 25], [321, 'Termo', 'PRG', 321, 'OFF', 'Vbat', '<', 24], [332, 'Depuradora', 'PRG', 332, 'OFF', 'Vbat', '<', 23], [321, 'Termo', 'PRG', 321, 'ON', 'SOC', '>', 90], [332, 'Depuradora', 'PRG', 332, 'ON', 'SOC', '>', 85], [321, 'Termo', 'PRG', 321, 'OFF', 'SOC', '<', 85], [332, 'Depuradora', 'PRG', 332, 'OFF', 'SOC', '<', 80]]
Situacion Rele_Out y Rele_Out_Ant antes algoritmo cuando Vbat= 22 SOC= 99
[[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]
Ejecutando bucle condiciones
Situacion Rele_Out despues cuando Vbat= 22 SOC= 99
[[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]
-------------------------------------------
Situacion Rele_Out y Rele_Out_Ant antes algoritmo cuando Vbat= 22 SOC= 50
[[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]
Ejecutando bucle condiciones
Situacion Rele_Out despues cuando Vbat= 22 SOC= 50
[[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]
-------------------------------------------
Situacion Rele_Out y Rele_Out_Ant antes algoritmo cuando Vbat= 27 SOC= 89
[[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]
Ejecutando bucle condiciones
Encendiendo rele = 1 1
Situacion Rele_Out despues cuando Vbat= 27 SOC= 89
[[0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]
-------------------------------------------
Situacion Rele_Out y Rele_Out_Ant antes algoritmo cuando Vbat= 27 SOC= 84
[[0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]
Ejecutando bucle condiciones
Situacion Rele_Out despues cuando Vbat= 27 SOC= 84
[[0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]
-------------------------------------------
Situacion Rele_Out y Rele_Out_Ant antes algoritmo cuando Vbat= 27 SOC= 92
[[0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]
Ejecutando bucle condiciones
Encendiendo rele = 0 0
Situacion Rele_Out despues cuando Vbat= 27 SOC= 92
[[1, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]
-------------------------------------------
Situacion Rele_Out y Rele_Out_Ant antes algoritmo cuando Vbat= 23.5 SOC= 92
[[1, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]
Ejecutando bucle condiciones
Apagando rele = 0 0
Situacion Rele_Out despues cuando Vbat= 23.5 SOC= 92
[[0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]
-------------------------------------------
Situacion Rele_Out y Rele_Out_Ant antes algoritmo cuando Vbat= 23.5 SOC= 79
[[0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]
Ejecutando bucle condiciones
Apagando rele = 1 1
Situacion Rele_Out despues cuando Vbat= 23.5 SOC= 79
[[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]
-------------------------------------------
Situacion Rele_Out y Rele_Out_Ant antes algoritmo cuando Vbat= 27 SOC= 95
[[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]
Ejecutando bucle condiciones
Encendiendo rele = 0 0
No Encendiendo rele = 1 1
Situacion Rele_Out despues cuando Vbat= 27 SOC= 95
[[1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]
-------------------------------------------
Situacion Rele_Out y Rele_Out_Ant antes algoritmo cuando Vbat= 27 SOC= 95
[[1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]
Ejecutando bucle condiciones
Encendiendo rele = 1 1
Situacion Rele_Out despues cuando Vbat= 27 SOC= 95
[[1, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]
-------------------------------------------
Situacion Rele_Out y Rele_Out_Ant antes algoritmo cuando Vbat= 22 SOC= 95
[[1, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]
Ejecutando bucle condiciones
Apagando rele = 0 0
Apagando rele = 1 1
Situacion Rele_Out despues cuando Vbat= 22 SOC= 95
[[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]
-------------------------------------------
>>>
Esto parece ya controlado....falta
A) Algoritmo programación horaria
B) Interfaz web para:
B1) Dar de alta/modificar/borrar Reles (Id, Nombre, Modo)
B2) Dar de alta/modificar/borrar condiciones de los Reles
B3) Dar de alta/modificar/borrar condiciones de horario de los Reles ...por ejm (Id_rele, Operacion (ON/OFF), Valor)Última edición por Mleon; 08/08/2016 a las 05:57
- 08/08/2016, 11:08 #429
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Perfecto, tanto el bucle FOR, como el encendido/apagado de reles en cada muestra.
Cambia esta última parte (donde el encendido/apagado):
Código PHP:#bucle encendido/apagado reles
Flag_Rele_Encendido = 0
for I in range(8):
for J in range(8):
if Rele_Out[I][J] == 1 and Rele_Out_Ant[I][J] == 0 and Flag_Rele_Encendido == 1 :
print('No Encender Rele (direccion,puerto)='),I,J #no encender rele
Rele_Out[I][J] = 0
if Rele_Out[I][J] == 1 and Rele_Out_Ant[I][J] == 0 and Flag_Rele_Encendido == 0 :
print('Encender Rele (direccion,puerto)='),I,J #encender rele
Flag_Rele_Encendido = 1
if Rele_Out[I][J] == 0 and Rele_Out_Ant[I][J] == 1:
print('Apagar Rele (direccion,puerto)='),I,J #apagar rele
Sobre la base de datos, ya había pensado en ello. Al moverla fuera del bucle principal, te obliga a cargar el programa cada vez que se haga un cambio. Y eso por ahora puede ser un problema.
No se en arduino, pero aquí puedes ejecutar el mismo programa las veces que quieras. Cada programa tiene asignado un número de identificación (PID). En caso de suceder, las muestras obtenidas no son reales, ni tampoco el contenido guardado en la BD. Ya me pasó alguna vez. Esto supongo que puede corregirse desde el propio sistema operativo con algún flag. Habrá que estudiarlo también.
Iremos viendo sobre la marcha. Demasiados palos estamos tocando.
- - - - - - - - - - - - - - - - - - -
Varias cosas:
Código PHP:import time # Al principio del programa, para importar funciones relacionadas con fecha/hora
while True: # Iniciar bucle principal (hay otra manera más elegante - def main() -, pero todavía no lo he mirado)
time.sleep(1.5) # el bucle se repite cada 1,5 segundos. Necesita del 'import time'
Luego para obtener fecha y hora u hora, tienes:
Código PHP:tiempo = time.strftime("%Y-%m-%d %H:%M:%S") #esta la uso para guaradar los registros en la BD
hora = time.strftime("%H:%M:%S") #para reiniciar el contador de kWh_batería a las 12 de la noche
Por ejemplo:
Código PHP:if (hora>= "00:00:00" and hora<="00:00:05"): # 5 seg. de margen (tiempo de mis muestras)
kWh_bat = 0.0
kWhp_bat = 0.0
kWhn_bat = 0.0
PvControl+: Control sistema fotovoltaico
Si te gusta la web, aquí el proyecto. El manual está aquí
¿Cómo conectar un Axpert a una Raspberry? Aquí
¿Cómo conectar un InfiniSolar a una Raspberry? Aquí
- 08/08/2016, 22:59 #430
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Ya he pasado los cambios al programa fv.py y repito, si no ponemos el número de integrados, la función i2c_rele() falla.
Código PHP:for I in range(1) : #numero de integrados instalados
for J in range(8) :
#Rele_Out[I][J] = 0
#Rele_Out_Ant[I][J] = 0
i2c_rele(I+32,J+1,0)
Código PHP:nikitto@asako ~/FV $ Traceback (most recent call last):
File "/home/nikitto/FV/fv.py", line 142, in <module>
i2c_rele(I+32,J+1,0)
File "/home/nikitto/FV/fv.py", line 75, in i2c_rele
estado=bus.read_byte(addr) #devuelve el valor en decimal
IOError: [Errno 5] Input/output error
PvControl+: Control sistema fotovoltaico
Si te gusta la web, aquí el proyecto. El manual está aquí
¿Cómo conectar un Axpert a una Raspberry? Aquí
¿Cómo conectar un InfiniSolar a una Raspberry? Aquí
- 08/08/2016, 23:33 #431
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
OK...supongo que sera por la libreria bus.read_byte(addr) que si intenta leer en un addr que no existe da error
Se pueden hacer varias cosas
A) Una seria controlar el error en Python.....viendo un poco el tema se podria hacer asi:
Código PHP:........
try:
estado=bus.read_byte(addr) #devuelve el valor en decimal
.....
.....
Una vez que el algoritmo funcione completamente, tendremos que plantearnos alguno temas de "supervivencia" de tal forma que si por ejm un integrado se estropea no implique que el programa aborte sino que funcione en forma degradada pero segura
- 09/08/2016, 01:21 #432
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Vale, este es el nuevo código:
Código PHP:# Defincion de funciones
def i2c_rele(addr,port,out) :
try:
estado=bus.read_byte(addr) #devuelve el valor en decimal
if out == 1 :
i2c_out = estado & (2**(port-1) ^ (255))
print('i2c_out(=1)'),i2c_out
else :
i2c_out = estado | 2**(port-1)
print('i2c_out(!=1)'),i2c_out
bus.write_byte(addr,i2c_out)
except:
pass
return
###
Para que podamos definir el número máximo de integrados:
Código PHP:### Definir matrices Rele_Out y Rele_Out_Ant y apagar todos los reles
Rele_Out = [[0] * 8 for i in range(8)]
Rele_Out_Ant = [[0] * 8 for i in range(8)]
for I in range(8) : #numero maximo de integrados
for J in range(8) :
i2c_rele(I+32,J+1,0)
PvControl+: Control sistema fotovoltaico
Si te gusta la web, aquí el proyecto. El manual está aquí
¿Cómo conectar un Axpert a una Raspberry? Aquí
¿Cómo conectar un InfiniSolar a una Raspberry? Aquí
- 09/08/2016, 02:09 #433
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Estupendo... en el bucle solo se escribe en direcciones que esten dadas de alta en la tabla Reles....por lo que a mi me parece bien que el programa no limite y se pueda poner por ejm un integrado en la direccion 32 y otro en la 38 y ademas que no se tenga que cambiar el codigo dependiendo del numero de integrados instalados
Una idea que se me ocurre es simplemente iniciar los reles en lugar de utilizar esta forma
Código PHP:for I in range(8) : #numero maximo de integrados
for J in range(8) :
i2c_rele(I+32,J+1,0)
Código PHP:for I in R
Puerto=(R[I][0]%10) # desde 1 a 8
Direct=int((R[I][0]-Puerto)/10) # direccion del Rele
i2c_rele(Direct,Puerto,0)
Última edición por Mleon; 09/08/2016 a las 03:39
- 09/08/2016, 22:30 #434
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Segundo día con el mismo fallo: Entre las 16h (hora en la que se apaga la depuradora por reloj, no así por relé, que sigue activo según condiciones establecidas) y las 17h, tanto el relé de la depuradora como el del termo se apagan. Y siguen sin activarse, cumpliéndose las condiciones.
El programa sigue funcionando tal cual, generando datos y demás.
- - - - - - - - - - - - - - - - - - -
La lectura de las tablas reles join reles_c vuelve a estar dentro del bucle, con lo cual pueden añadirse nuevas condiciones sin necesidad de relanzar el programa.PvControl+: Control sistema fotovoltaico
Si te gusta la web, aquí el proyecto. El manual está aquí
¿Cómo conectar un Axpert a una Raspberry? Aquí
¿Cómo conectar un InfiniSolar a una Raspberry? Aquí
- 10/08/2016, 03:55 #435
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Pasame el código completo (por mp o aqui) junto con las tablas Rele y Rele_C dadas de alta y lo miro por si detecto el origen del fallo
- - - - - - - - - - - - - - - - - - -
Visto el codigo ......detecto dos temas (no te lo mando por privado dado que tienes el buzón lleno
En esta parte hay que poner int para asegurar que el valor de GR es correcto
Código PHP:.......
for I in range(ncon):
Puerto=(R[I][0]%10)-1 # desde 0 a 7
GR=int((R[I][0]-Puerto)/10)-32 # desde 0 donde GR=0 si id_rele=32X, GR=0 si id_rele=33X
Rele_Out[GR][Puerto]=1 #encendemos virtualmente todos los eles por defecto
for I in range(ncon):
Puerto=(R[I][0]%10)-1 # desde 0 a 7
GR=int((R[I][0]-Puerto)/10)-32 # desde 0 donde GR=0 si id_rele=32X, GR=0 si id_rele=33X
...........
.....
Código PHP:if Rele_Out[I][J] == 1 and Rele_Out_Ant[I][J] == 0 and Flag_Rele_Encendido == 0 :
i2c_rele(I+32,J+1,1) #encender rele
Flag_Rele_Encendido=1
- 10/08/2016, 08:24 #436
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Aplicaré los cambios que mencionas y veremos como va.
Voy a vaciar el buzón también.
A parte de putty.exe, uso: SSH Secure Shell Client, o para la transferencia de archivos (win-linux-win) uso: SSH Secure File Transfer Client
Si quieres practicar un poco con Linux, puedes instalarte el VMware Player para Windows, luego bajas p.e. ubuntu y lo instalas en la máquina virtual (VMware) y a experimentar.
Por cierto, si ves conveniente que tu hijo le de un vistazo al programa, por el tema depuración, sin problemas. En general tiene un sentido: importar librerías, declarar variables, declarar funciones, importar datos de la BD y bucle principal con lectura de variables, tratamiento de las mismas y escritura en BD. De todas formas, seguro puede depurarse y mucho.Última edición por nikitto; 10/08/2016 a las 08:47
PvControl+: Control sistema fotovoltaico
Si te gusta la web, aquí el proyecto. El manual está aquí
¿Cómo conectar un Axpert a una Raspberry? Aquí
¿Cómo conectar un InfiniSolar a una Raspberry? Aquí
- 10/08/2016, 15:21 #437
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Con estas nubes, hoy probaremos seguro el control fotovoltaico.
- - - - - - - - - - - - - - - - - - -
El relé de la depuradora hace lo que debe, por encima de vbat y soc se enciede, por debajo de cualquiera de los dos valores definidos, se apaga.
El termo por el contrario se ha apagado en una de las veces que se apagó la depuradora (sin haber caido el valor de ninguo de los parámetros definidos) y sigue apagado aún cumpliéndose las dos.PvControl+: Control sistema fotovoltaico
Si te gusta la web, aquí el proyecto. El manual está aquí
¿Cómo conectar un Axpert a una Raspberry? Aquí
¿Cómo conectar un InfiniSolar a una Raspberry? Aquí
- 10/08/2016, 15:32 #438el_cobarde Invitado
- 10/08/2016, 15:49 #439
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
PvControl+: Control sistema fotovoltaico
Si te gusta la web, aquí el proyecto. El manual está aquí
¿Cómo conectar un Axpert a una Raspberry? Aquí
¿Cómo conectar un InfiniSolar a una Raspberry? Aquí
- 10/08/2016, 16:19 #440el_cobarde Invitado
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Si, ya me he dado cuenta de que no necesitáis ayuda. De todas formas sigo el hilo con mucho interés.
Para entrar en la web: Sería mucho más cómodo si la dirección web aparecería en tu firma "Raspberry Pi: Control ..."
Edito: Perdón, veo que ya está hecho. Basta pinchar encima de la firma. Muy bien!
- 10/08/2016, 16:19 #441
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Leñe...algo se esta escapando...en el algoritmo de simulacion que tengo van sin problemas todos los reles
Para pillarlo..vamos a poner algunos elementos de control
En la pagina web de reles o donde te sea mas facil captura cuando se supone que no esta funcionando bien
- Situación reles: lo que ya esta
- Valores de DatosFV[]
- Valor de R[]
- Valor de ncon
- Valor de Rele_Out[]
- Valor de Rele_Out_Ant[]
- Valor de Flag_Rele_Encendido
Simulando con los valores que tienes...este es el resultado
Código PHP:Situacion Rele_Out despues cuando Vbat= 27.22 SOC= 95.25
[[1, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]
Cuando revise el programa ayer (con Python 3.5) ademas de modifilarlo para simular la parte de BD y captura de valores, me dio varios errores de "ident" que tuve que corregir con el IDLE de Python (usando Ident region y Dedent region)Última edición por Mleon; 10/08/2016 a las 16:47
- 10/08/2016, 16:43 #442
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
He cambiado esto casi al final del programa....
Código PHP:cur.close()
reles.close()
# Repetir bucle cada 5 segundos
time.sleep(5)
Creo que eso tiene que ver con los saltos del tabulador, luego los reviso todos.
Igualmente definiré un int(Puerto) al principio del programa.PvControl+: Control sistema fotovoltaico
Si te gusta la web, aquí el proyecto. El manual está aquí
¿Cómo conectar un Axpert a una Raspberry? Aquí
¿Cómo conectar un InfiniSolar a una Raspberry? Aquí
- 10/08/2016, 18:29 #443
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Nikitto
Mientras se pilla el fallo...por eso de tener caracter español y hacer varias cosas a la vez....hay que codificar el control por horario
¿Quieres que me piense yo el algoritmo o prefieres pensarlo tu?PVControl+ (web espejo a la real cada 5'...se puede trastear)
Manual Instalación desde Imagen SD
Manual Instalación Reles Wifi
Algo de Funcionalidad (ya tiene control excedentes via wifi, etc...)#743
- 10/08/2016, 19:12 #444
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Voy mirándolo, pero dime donde quieres poner la hora de encendido y apagado. Otra tabla ?
PvControl+: Control sistema fotovoltaico
Si te gusta la web, aquí el proyecto. El manual está aquí
¿Cómo conectar un Axpert a una Raspberry? Aquí
¿Cómo conectar un InfiniSolar a una Raspberry? Aquí
- 10/08/2016, 19:25 #445
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Parece lógico poner otra tabla, y...si seguimos con la misma lógica empleada:
- id_rele
- parametro_h: (puede tener los valores T (todos los dias) o L,M,X,J,V,S,D
- operacion_h: ON u OFF
- Valor_h: hora en la que queremos que se encienda o apague
Con esto deberíamos poder encender o apagar las veces que queramos y poder decidir si diariamente o que dia de la semana
En este caso dado que no hay campo condicion ">" o "<",,.....mejor dicho la condicion siempre es ">" por lo que no hace falta ponerla, te puedes plantear juntar en un solo registro ON y OFF tal que:
- id_rele
- parametro_h: puede tener los valores T (todos los dias) o L,M,X,J,V,S,D
- Valor_h_ON: hora en la que queremos que se encienda
- Valor_h_OFF: hora en la que queremos que se apague
- 10/08/2016, 19:59 #446
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Me parece bien, supongo que luego podemos hacer un:
'SELECT * FROM reles JOIN reles_c JOIN reles_h WHERE reles.id_rele = reles_c.id_rele = reles_h.id_rele' ????
- - - - - - - - - - - - - - - - - - -
Te he dejado el archivo fv.py corregido: saltos de tabulador.PvControl+: Control sistema fotovoltaico
Si te gusta la web, aquí el proyecto. El manual está aquí
¿Cómo conectar un Axpert a una Raspberry? Aquí
¿Cómo conectar un InfiniSolar a una Raspberry? Aquí
- 10/08/2016, 20:47 #447Forero
- Fecha de ingreso
- oct 2014
- Ubicación
- Masquefa
- Mensajes
- 351
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Como se nota que estamos de vacaciones y hay tiempo para cacharrear.....
Bona feina!!!Biomasa: GREEN ECOTHERM Mario Long Time 18kW + DI 500l + Retenedor humos + Estabilizador de tiro
Solar: 10590Wp + 48V 1000Ah C5 + OUTBACK FLEXMAX LCD 80A + Fangpusun 80A + Inversor Schneider XW+ 8548 E
Monitoring Solar con Rpi
- 10/08/2016, 21:11 #448
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
PvControl+: Control sistema fotovoltaico
Si te gusta la web, aquí el proyecto. El manual está aquí
¿Cómo conectar un Axpert a una Raspberry? Aquí
¿Cómo conectar un InfiniSolar a una Raspberry? Aquí
- 10/08/2016, 22:28 #449
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Creo que si se hace un join de las tres tablas se complica mas el algoritmo que si se tienes 2 join distintos:
- Uno con la condiciones de Vbat,..
- Otro con las condiciones de horario
Ademas con un join de 3 tablas no se podria dar el caso de un rele que se activara solamente por horario (sin otras condiciones) o solo por condiciones (sin horario)..
Ten en cuenta que 1 rele puede tener N condiciones por horario (por ejm encender la depuradora un rato por la mañana y otro por la tarde)
Pero vamos .... dale una vuelta a como seria el algoritmoÚltima edición por Mleon; 10/08/2016 a las 22:46
- 10/08/2016, 22:54 #450
Re: Control exhaustivo ciclo de carga/SOC/Cargas/etc
Vale, creía que querías relacionarlo todo. No tiene sentido poner la depuradora a las 11h si la batería está descargada o el voltaje es muy bajo o ...
Posteriormente ya tendremos los modos On/Off para saltarnos las restricciones. ¿Cómo tienes tú lo de los horarios?
Por ahora la tabla está creada, el Join sólo ha sido una prueba, bajo MySQL.PvControl+: Control sistema fotovoltaico
Si te gusta la web, aquí el proyecto. El manual está aquí
¿Cómo conectar un Axpert a una Raspberry? Aquí
¿Cómo conectar un InfiniSolar a una Raspberry? Aquí