Caldera-ino/scripts/caldera.py

177 lines
5.2 KiB
Python
Executable File

#!/usr/bin/env python3
"""
Script de control Caldera automatizada [Arduino]+[ESP01]
"""
import os
import sys
from time import sleep
import configparser as cfg
import vista_term as vt
try:
parser = cfg.ConfigParser()
parser.read('config.cfg')
ESP01 = parser.get('esp01', 'URL')
except cfg.Error as ex:
print('Error al leer archivo de configuración')
sys.exit()
try:
import requests
except ModuleNotFoundError as ex:
print("Debes instalar los modulos necesarios\n")
print(ex)
sleep(2)
sys.exit()
clear = lambda: os.system('clear') if os.name == 'posix' else os.system('cls')
def enviar_consulta(consulta):
"""Retorna la respuesta a la petición GET *consulta*
:consulta: str ( consulta creada por consultas() )
:returns: str ( respuesta del GET request )
"""
resp = requests.get(consulta)
return resp.text
def consultas(modo, id_modo='', datos=['']):
"""Crea la petición GET según si los datos son list o str
Retorna la respuesta de enviar_consulta()
:modo: str (sub-menu)
:id_modo: str (id modo de operacion)
:datos: list[str] | str
:returns: str (respuesta del GET request)
"""
if id_modo != '':
modo = modo + '?1=' + id_modo
orden = ''
cont = 2
if type(datos) is list:
if len(datos) == 1:
orden = ''
else:
for dato in datos:
if dato != '':
orden += '&' + str(cont) + '=' + str(dato)
cont += 1
else:
orden += '&' + str(cont) + '=' + str(datos)
resp = enviar_consulta(ESP01 + modo + orden)
return resp
intentos=0
def datos_a_lista() -> list[str] :
"""Retorna el str recibido de consultas() como una lista, valida el largo
de la lista, añade 0 o ' ' a valores, según sea necesario para el correcto
formateo del texto a mostrar.
:returns: list[str] ( len(list) = 16 )
"""
datos = []
global intentos
while True:
try:
resp = consultas('')
for var in resp.split(','):
datos.append(var)
assert len(datos) == 16
for i in range(10,15):
if int(datos[i]) < 10:
datos[i] = '0'+datos[i]
for i in range(2,6):
if int(datos[i]) < 10:
datos[i] = ' '+datos[i]
intentos = 0
return datos
except KeyboardInterrupt:
sys.exit()
except AssertionError:
vt.resp_conex('assert', intentos)
intentos += 1
sleep(2)
except ConnectionError:
vt.resp_conex('conexion', intentos)
intentos += 1
sleep(2)
except OSError:
vt.resp_conex('oserror', intentos)
intentos += 1
sleep(2)
if intentos > 4:
vt.resp_conex()
sys.exit()
def main():
global intentos
while True:
# Lista con valores de los datos recibidos
vals = datos_a_lista()
clear()
vt.pant_principal(vals[0], vals[1], vals[10:16], vals[2:6])
modo_user = vt.entrada_usuario()
match modo_user:
case 's':
sys.exit()
case '1':
#vt.pant_test_valores(vals)
vt.respuesta_config(consultas('/auto'))
intentos = 0
sleep(3)
case'2':
vt.pant_config_fecha(vals[10:16])
resp_user = vt.entrada_usuario('/sethora')
vt.respuesta_config(consultas('/sethora', modo_user, resp_user))
intentos = 0
sleep(5)
case '3':
vt.pant_termporizador(vals[2:6])
resp_user = vt.entrada_usuario('/horasAcc')
vt.respuesta_config(consultas('/horasAcc', modo_user, resp_user))
intentos = 0
sleep(5)
case '4':
pos_servo = []
for val in vals[6:10]:
if int(val) < 100:
pos_servo.append(' '+val)
else:
pos_servo.append(val)
vt.pant_posic_servo(pos_servo)
resp_user = vt.entrada_usuario('/setservo')
vt.respuesta_config(consultas('/setservo', modo_user, resp_user))
intentos = 0
sleep(5)
case '5':
vt.pant_accion_manual(vals[1])
resp_user = vt.entrada_usuario('/accion')
vt.respuesta_config(consultas('/accion', modo_user, resp_user))
intentos = 0
sleep(5)
case '6':
vt.pant_servo_manual()
resp_user = vt.entrada_usuario('/setlibre')
vt.respuesta_config(consultas('/setlibre', modo_user, resp_user))
intentos = 0
sleep(5)
case '':
vt.respuesta_info()
sleep(1.5)
case 'v':
vt.respuesta_info('volver')
intentos = 0
sleep(1.5)
case _:
modo_user = vt.entrada_usuario()
vt.respuesta_info('error')
sleep(1.5)
if __name__ == "__main__":
main()