/** * Archivo principal de la administracion grafica de la aplicacion EMA Libre. * * Archivo de inicio el entorno grafico GUI del sistema EMA Libre que nos * brinda una pantalla con las opciones: Configuracion general del sistema, * ABM de Redes Meteorologicas,Visualizacion del sensores e informacion enviadas a la redes y * reportes de log, como historicos registrados. * * LICENSE: This file is part of EMA Libre. * EMA Libre is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * EMA Libre is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with EMA Libre. If not, see . * * @copyright Copyright (c) 2019 GUGLER (http://www.gugler.com.ar) * @license https://www.gnu.org/licenses/gpl-3.0.html GPL License * @version 3.0 * @link http://www.gugler.com.ar * @since File available since Release 3.0 */ // **********************Dependencias (unificadas) ************************** // Este bloque detecta si estamos en NW.js (desktop) o en un navegador (web) // y exporta las variables necesarias para el resto del archivo. var configGeneralEMA, configGlobalEMA, funcionesActualizar, EMA, gui, os, win; var _IS_NW = false; const iconoEncendido = './gui_common/iconos/icono_enc.png'; // Imagen del Icono Encendido const iconoApagado = './gui_common/iconos/icono_off.png'; // Imagen del Icono Apagado const iconoPublicado = './gui_common/iconos/icono_pub.png'; // Imagen del Icono Prublicado --> no utilizada const iconoNeutro = '../gui_common/img/neutro.webp'; // Imagen del Icono Neutro const iconoControlTrue = '../gui_common/img/ok.webp'; // Imagen de Control TRUE const iconoControlFalse = '../gui_common/img/no.webp'; // Imagen de Control FALSE try { _IS_NW = (typeof process !== 'undefined' && process.versions && process.versions['nw']); } catch (e) { _IS_NW = false; } // Si estamos en NW.js, cargamos los módulos locales if (_IS_NW) { configGeneralEMA = require('./../conf/ConfiguracionGeneral.js'); // Configuracion General configGlobalEMA = require('./../conf/ConfiguracionGlobal.js'); // Configuracion Global funcionesActualizar = require('./../core/actualizar.js'); // Se incluye el core de EMA. EMA = require('./../core/ema.js'); // Se incluye el core de EMA. gui = require('nw.gui'); // Libreria Grafica os = require('os'); // Libreria del sistema operativo win = gui.Window.get(); // ventana actual // **********************Iconizado / Menu Superior ********************************************************* gui.App.clearCache(); // Se limpia cache win = gui.Window.get(); // Se obtiene la ventana actual // Crear el icono en el tray function createTray() { if (tray) return; // Evitar duplicados // Crear menú contextual (sin 'menubar') const menu = new nw.Menu(); menu.append(new nw.MenuItem({ type: 'checkbox', label: 'box1' })); menu.append(new nw.MenuItem({ label: 'Iniciar', click: () => { if (typeof INICIAR === 'function') INICIAR(); } })); menu.append(new nw.MenuItem({ label: 'Detener', click: () => { if (typeof DETENER === 'function') DETENER(); } })); menu.append(new nw.MenuItem({ type: 'separator' })); menu.append(new nw.MenuItem({ label: 'Mostrar ventana', click: () => { win.show(); win.restore(); win.focus(); win.setShowInTaskbar(true); removeTray(); } })); menu.append(new nw.MenuItem({ label: 'Ocultar ventana', click: () => { win.hide(); win.setShowInTaskbar(false); } })); menu.append(new nw.MenuItem({ type: 'separator' })); menu.append(new nw.MenuItem({ label: 'Salir', click: () => { if (typeof EMA !== 'undefined' && typeof EMA.Salir === 'function') EMA.Salir(); nw.App.closeAllWindows(); nw.App.quit(); } })); // Crear tray icon tray = new nw.Tray({ title: 'EmaLibre Carpincho', icon: iconoApagado, }); tray.menu = menu; // Click izquierdo: mostrar ventana tray.on('click', () => { console.log('Tray icon clicked'); win.show(); win.restore(); win.focus(); win.setShowInTaskbar(true); removeTray(); if (typeof MuestraRegistroActual === 'function') MuestraRegistroActual(false); if (typeof Graficos === 'function') Graficos(); if (typeof ClimaActual === 'function') ClimaActual(); }); // Click derecho: abrir menú manualmente si el entorno no lo hace tray.on('right-click', () => { console.log('Tray icon right-clicked'); tray.menu.popup(); }); // Doble click: también mostrar tray.on('double-click', () => { win.show(); win.focus(); win.setShowInTaskbar(true); removeTray(); }); } nw.Window.get().on('loaded', createTray); // Captura el redimencionamiento de la ventana win.on('resize', (width, height) => { if (width < 775 && height < 555) { win.zoomLevel = -2.4; } if (width > 775 && height > 555) { win.zoomLevel = -1.8; } if (width > 800 && height > 600) { win.zoomLevel = -1.5; } if (width > 850 && height > 690) { win.zoomLevel = -0.6; } if (width > 1000 && height > 800) { win.zoomLevel = 0; } if (width > 1200 && height > 820) { win.zoomLevel = 0.3; } if (width > 1200 && height > 900) { win.zoomLevel = 0.9; } if (width > 1400 && height > 1000) { win.zoomLevel = 1.2; } }); } else { // Entorno Web: cargamos la configuración vía HTTP y exponemos wrappers mínimos configGeneralEMA = undefined; configGlobalEMA = undefined; funcionesActualizar = undefined; EMA = undefined; gui = undefined; os = undefined; win = undefined; // Obtener configs desde endpoints del servidor if (typeof $ !== 'undefined') { $.get('/configGeneralEMA', function (data) { configGeneralEMA = data; }); $.get('/configGlobalEMA', function (data) { configGlobalEMA = data; }); } // Definir wrappers ligeros para funciones que el código usa (compatibilidad) EMA = { Conectar: function () { if (typeof $ !== 'undefined') { $.get('/iniciar'); } }, Detener: function () { if (typeof $ !== 'undefined') { $.get('/detener'); } }, IncrementarRepeticionesConError: function () { if (typeof $ !== 'undefined') { $.get('/IncrementarRepeticionesConError'); } }, RepeticionesConError: function () { if (typeof $ !== 'undefined') { return $.get('/RepeticionesConError'); } }, HayPendientes: function () { if (typeof $ !== 'undefined') { return $.get('/HayPendientes'); } } }; funcionesActualizar = { Control: function (cb) { if (cb) cb(false, null, null); }, Descargar: function () {}, Descomprimir: function () {}, Desplegar: function () {}, LanzarAplicativoIndependiente: function () {} }; } // **********************Vairales Generales********************* let tray = null; var UltimoReg; var Ant_UltimoReg; var ModeloVisor; // Variables Generales - Registros recolectados var destanqueo = 0; var intervaloBarra = 0; var cant = 0; var tiempovisor=99; const esperar = ms => new Promise(function(resolve){setTimeout(resolve, ms);}); //new gui.Shortcut({ key: 'F11', active: function () { win.toggleFullscreen(); } }) // **********************Funciones Principales de la GUI ***************************************************** async function cargarInterfaces() { let interfaces; if (_IS_NW) { interfaces = os.networkInterfaces(); } else { interfaces = await $.get('/interfaces'); } return interfaces; } function INICIAR () { if (configGeneralEMA.ConfGeneral.Modo === 'Visor') { // se comprueba el modo HABLA(0, 'Se inicio en modo Visor', 'success'); $('#signal').addClass('parpadea'); } else { EMA.Conectar(); HABLA(0, 'Se inicio en modo Recolector', 'success'); $('#signal').addClass('parpadea'); } if (_IS_NW) tray.icon = iconoEncendido; $('td#barralateral').css('background-color', '#11881161'); $('#estado').html('En Linea'); $('#mensaje').html('Encendido'); $('#botoniniciar').attr('disabled', true); $('#botondetener').attr('disabled', false); if (_IS_NW) { RegistroActual();}else{RegistroActualW();} // Asegurar que no haya intervalos duplicados if (intervaloBarra) { clearInterval(intervaloBarra); } // Iniciar nuevo intervalo y guardarlo intervaloBarra = window.setInterval(function () { try { BarradeProgreso(); } catch (e) { console.error('Error en BarradeProgreso:', e); // Reintentar iniciar el intervalo si falla clearInterval(intervaloBarra); intervaloBarra = window.setInterval(function () { BarradeProgreso(); }, 200); } }, 200); } async function iniciarAutomaticamente () { EstadoMenuInicio(); if (configGeneralEMA.ConfGeneral.inicio_automatico) { await esperar(4000); HABLA(0, 'Iniciando Automaticamente..', 'info'); if ($('#mensaje').html() === 'Encienda EMA Libre' || $('#mensaje').html() === 'EMA Libre se encuentra detenida' || $('#mensaje').html()) await esperar(5000); INICIAR(); } if ($('#mensaje').html() === 'Recolectado por IP') { HABLA(0, 'EMA ya se encuentra recolectando', 'info'); } } function killAllTimers() { // Preservar el intervalo de la barra de progreso si existe const barraInterval = intervaloBarra; // Limpiar intervalos conocidos primero if (intervaloBarra) { clearInterval(intervaloBarra); } // Limpiar timeouts y otros intervalos de manera más selectiva const timeouts = []; const intervals = []; // Crear y detectar últimos IDs usados timeouts.push(setTimeout(() => {}, 0)); intervals.push(setInterval(() => {}, 9999999)); // Limpiar los detectores timeouts.forEach(t => clearTimeout(t)); intervals.forEach(i => clearInterval(i)); } function DETENER () { clearInterval(intervaloBarra); killAllTimers(); if (_IS_NW) tray.icon = iconoApagado; $('td#barralateral').css('background-color', '#ff000030'); $('#estado').html('Fuera de Linea'); $('#img_estado').attr('src', iconoNeutro); $('#mensaje').html('EMA Libre se encuentra detenida'); $('#mensajedetalle').html('Se detuvo manualmente.'); $('#img_detalle').attr('src', iconoNeutro); $('#img_mensaje').attr('src', iconoNeutro); $('#botoniniciar').attr('disabled', false); $('#botondetener').attr('disabled', true); if (configGeneralEMA.ConfGeneral.Modo === 'Visor') { // se comprueba el modo HABLA(0, 'Modo visor detenido', 'error'); $('#signal').removeClass('parpadea'); } else { EMA.Detener(); HABLA(0, 'Modo Recolector detenido', 'error'); $('#signal').removeClass('parpadea'); } } async function redimensionarInicio () { $('#loadinicio').attr('src', '../gui_common/iconos/icono_app_guina.webp'); await esperar(500); $('#loadinicio').attr('src', '../gui_common/iconos/icono_app.webp'); await esperar(600); $('#cargador').empty(); $('#cargador').remove(); $('#principal').show(); if (_IS_NW) { win.setMinimumSize(700, 500); win.setMaximumSize(4000, 2000); win.maximize(); } HABLA(0, '...', 'info'); await esperar(1000); HABLA(0, 'Bienvenido a Ema Libre Cliente, me llaman Carpincho.', 'info'); iniciarAutomaticamente(); } async function Actualizar () { var plataforma = process.platform; var SO_WIN = plataforma.indexOf('win'); if (SO_WIN === 0) { funcionesActualizar.Control(function (resultado, VersionActual, nueva) { $('#botonactualizar').attr('disabled', true); if (resultado && VersionActual) { DETENER(); HABLA(0, 'Descargando nueva versión de Carpincho: ' + nueva, 'info'); NProgress.set(0); $('#mensajebarra').html('Descargando nueva versión, espere ....'); funcionesActualizar.Descargar(nueva, function (resultadoact, avance, porcentaje) { NProgress.set(porcentaje/100); $('#mensajebarra').html(avance); if (resultadoact && avance) { NProgress.set(1); $('#mensajebarra').html('Descomprimiendo la nueva versión, espere ....'); HABLA(0, 'Descomprimiendo la nueva versión, espere ....', 'info'); funcionesActualizar.Descomprimir(function (resultadoact) { if (resultadoact) { $('#mensajebarra').html('Borrado del archivo descargado, espere ....'); funcionesActualizar.Desplegar(function (resultado) { if (resultado) { HABLA(0, 'Ejecutando App de Actualizacion, espere...', 'info'); setTimeout(funcionesActualizar.LanzarAplicativoIndependiente, 9000); } else { HABLA(0, 'Ocurrio un problema en el despliege, intente mas tarde', 'error'); } }); } else { HABLA(0, 'Ocurrio un problema descomprimiendo, intente mas tarde', 'error'); } }); } if (!resultadoact && !avance) { HABLA(0, 'Ocurrio un problema en la descarga, intente mas tarde', 'error'); } }); } if (!resultado && VersionActual) { HABLA(0, 'No hay versiones nuevas disponibles', 'success'); } if (!resultado && !VersionActual) { HABLA(0, 'No se pudo conectar al servidor de versiones,pruebe mas tarde...', 'error'); } }); } else { HABLA(0, 'Esta opción solo es válida para sistemas operativos Windows.', 'warn'); await esperar(4000); HABLA(0, 'Pero usted puede actualizar EMA Libre con su sistema de paquetes nativo.', 'info'); await esperar(4000); HABLA(0, 'O puede ingresar a https://ema.gugler.com.ar para más información. ', 'info'); } $('#botonactualizar').attr('disabled', false); } async function HABLA (num, mesg, tipo) { var tamañomsg = mesg.length; if (num === 0) { $('#carpincho_img').notify(mesg, { className: tipo, position: 'right middle', autoHideDelay: (tamañomsg * 90) }); if (configGeneralEMA.ConfGeneral.Audio) { window.speechSynthesis.cancel(); var voices = window.speechSynthesis.getVoices(); var cantidadVoces = voices.length; //console.log(cantidadVoces); if( cantidadVoces > 0){ var seleccionada = voices.filter(function (voice) { return voice.name === configGeneralEMA.ConfGeneral.audioVoces; })[0]; //console.log(seleccionada); var msg = new SpeechSynthesisUtterance (mesg); msg.voice = seleccionada; msg.rate = 1.2; msg.pitch = 1; window.speechSynthesis.speak(msg); msg=null;seleccionada=null;voices=null;cantidadVoces=null; } } } if ($('#carpincho_img').attr('src') === '../gui_common/iconos/icono_app.webp') { $('#carpincho_img').attr('src', '../gui_common/iconos/icono_app_habla.webp'); } else { $('#carpincho_img').attr('src', '../gui_common/iconos/icono_app.webp'); } num++; if (num < tamañomsg) { await esperar(90); HABLA(num ,mesg ,0); } else { $('#carpincho_img').attr('src', '../gui_common/iconos/icono_app.webp'); //LimpiarMemoria(true); } num=null;tamañomsg = null; } async function GUIÑA (num) { if ($('#carpincho_img').attr('src') === '../gui_common/iconos/icono_app.webp') { $('#carpincho_img').attr('src', '../gui_common/iconos/icono_app_guina.webp'); } else { $('#carpincho_img').attr('src', '../gui_common/iconos/icono_app.webp'); } num++; if (num < 2) { await esperar(400); GUIÑA(num); } else { $('#carpincho_img').attr('src', '../gui_common/iconos/icono_app.webp'); } num =null; } async function controlPendientes () { var pendientes = await EMA.HayPendientes(); var DIVPENDIENTE = document.getElementById('DIVPendientes'); var SPANTANQUE = document.getElementById('Destanqueo'); var DIVModo = document.getElementById('DIVModo'); if (pendientes !== false) { DIVPENDIENTE.style.visibility = 'visible'; if ((pendientes < destanqueo)) {SPANTANQUE.style.visibility = 'visible'; } else {SPANTANQUE.style.visibility = 'hidden'; } destanqueo = pendientes; $('#Pendientes').html(" Cantidad: " + pendientes + '
'); } else { destanqueo = 0; DIVPENDIENTE.style.visibility = 'hidden'; SPANTANQUE.style.visibility = 'hidden'; DIVModo.style.visibility = 'hidden'; } pendientes = null; DIVPENDIENTE = null; SPANTANQUE = null; DIVModo = null; return true; } async function mostrarEstados (EstadoSensores) { // Se consulta por los sensores if(configGeneralEMA.ConfGeneral.Modo === "Recolector_IP") { if (EstadoSensores === "0") { $('#signal').attr('src', '../gui_common/img/signal.webp'); $('#signal').attr('title', 'Estacion IP/WIFI Conectada'); }else{ $('#signal').attr('src', '../gui_common/img/no_signal.webp'); if(_IS_NW){ if(EMA.UltimoRegistro()){$('#signal').attr('title', 'Bateria Baja Controlar'); HABLA(0, 'Bateria baja de la estacion IP/WIFI externa', 'warn');} } } $('#signal').addClass('parpadea'); $('#signal').tooltip('dispose'); $('#signal').tooltip(); }else{ var Resultado = !((EstadoSensores.lost_sensor_contact) || (EstadoSensores.rain_overflow)); if (Resultado && (configGeneralEMA.ConfGeneral.Modo !== 'Visor')) { $('#signal').attr('src', '../gui_common/img/signal.webp'); $('#signal').addClass('parpadea'); } else { if (!EstadoSensores.lost_sensor_contact) { HABLA(0, 'Perdida de la señal de Radio Frecuencia', 'warn'); } if (!EstadoSensores.rain_overflow) { HABLA(0, 'Sensor de lluvia externo sobrecargado', 'warn'); } $('#signal').attr('src', '../gui_common/img/no_signal.webp'); $('#signal').addClass('parpadea'); win.requestAttention(3); } EstadoSensores = null; Resultado = null; } } async function RegistroActualW (barratermino) { if (['Recolector_USB', 'Recolector_IP'].includes(configGeneralEMA.ConfGeneral.Modo)) { // se comprueba el modo se encuentra en Recolector if(barratermino == true){ //BARRA TERMINO //console.log('ENTRO AL BARRA TERMINO RECOLECTOR'); await esperar(100); EstadoMenuInicio(); await esperar(100); MuestraRegistroActual(true); await esperar(100); Graficos(); await esperar(100); ClimaActual(); await esperar(1500); RegistroPublicado(); cant=0; } $.get("/EMA_estado", async function(data, status){ var EstadoEMA = data; if (EstadoEMA[0] === true) { $('#img_detalle').attr('src', iconoControlTrue); $('#img_mensaje').attr('src', iconoControlTrue); if(configGeneralEMA.ConfGeneral.Modo === "Recolector_IP") { $('#mensaje').html('Recolectado por IP.'); }else{ $('#mensaje').html('Recolectando.'); $('#mensajedetalle').html('Operando.'); } controlPendientes(); $.get("/EstadoSensores", function(data, status){ var EstadoSensores = data; if(EstadoSensores !== false) { mostrarEstados(EstadoSensores); }else{EstadoSensores=null;} }); await esperar(1000); //console.log('Consultando por el ultimo registro...'); var cantidad_E = await EMA.RepeticionesConError(); $.get("/UltimoRegistro", function(data, status){ UltimoReg = data; if (UltimoReg == false) { // Se consulta por la cantidad de errores if (cantidad_E > 3) { if(configGeneralEMA.ConfGeneral.Modo === "Recolector_IP") { $('#mensaje').html('Recolectado por IP.'); $('#img_mensaje').attr('src', iconoNeutro); $('#mensajedetalle').html('(' +cantidad_E + ') Sincronizando ...'); // HABLA(0, 'No se pueden obtener registros (Intentos ' + EMA.RepeticionesConError() + '). Revise por favor su configuración IP/WIFI de la estación.', 'error'); EMA.IncrementarRepeticionesConError(); } else{ $('#img_mensaje').attr('src', iconoNeutro); $('#img_detalle').attr('src', iconoNeutro); // HABLA(0, 'No se pueden obtener registros (Intentos ' + EMA.RepeticionesConError() + '). Desconecte y vuelva a conectar el USB. Se prueba reiniciar el servicio.', 'error'); // esperar(15000); // DETENER(); // esperar(5000); // INICIAR(); } RegistroActualW(); return false; } else { $('#mensajedetalle').html('(' + cantidad_E + ') Sincronizando ...'); if(configGeneralEMA.ConfGeneral.Modo === "Recolector_IP") EMA.IncrementarRepeticionesConError(); $('#img_detalle').attr('src', iconoNeutro); esperar(2000); RegistroActualW(); return false; } } }); } else { $('#mensaje').html('EmaLibre detenida.'); $('#img_mensaje').attr('src', iconoControlFalse); $('#mensajedetalle').html(EstadoEMA[1]); $('#img_detalle').attr('src', iconoControlFalse); await esperar(5000); RegistroActualW(); return false; } }); } else { // Modo visor if(barratermino == true){ //BARRA TERMINO await esperar(100); EstadoMenuInicio(); await esperar(100); MuestraRegistroActual(true); await esperar(100); Graficos(); await esperar(100); ClimaActual(); cant=0; } $('#signal').attr('src', 'img/visor.webp'); $.get("/Visor", function(data, status){ if (data[0] != null) { HABLA(0, 'No se pueden obtener datos del servidor. ' + data[0], 'info'); $('#signal').removeClass('parpadea'); setTimeout(function(){RegistroActualW();}, 10000); } else { $('#signal').addClass('parpadea'); var DIVModo = document.getElementById('DIVModo'); DIVModo.style.visibility = 'visible'; document.getElementById('DIVModo').innerHTML = " Modo Visor
" + data[1].pais + ', ' + data[1].ciudad + "
" + data[1].modelo + ''; UltimoReg = data[1].registros[0]; ModeloVisor = data[1].nombre; // se convierte la fecha var db = new Date(data[1].registros[0].fecha); var minutos = db.getMinutes(); if (minutos <= 9) { minutos = '0' + minutos; } var hora = db.getHours(); if (hora <= 9) { hora = '0' + hora; } var mes = db.getMonth() + 1; if (mes <= 9) { mes = '0' + mes; } var dia = db.getDate(); if (dia <= 9) { dia = '0' + dia; } var segundo = db.getSeconds(); if (segundo <= 9) { segundo = '0' + segundo; } var fecha = dia + '/' + mes + '/' + db.getFullYear() + ' ' + hora + ':' + minutos + ':' + segundo; UltimoReg.fecha = fecha; fecha=null;dia=null;mes=null;segundo=null;minutos=null;hora=null;db=null; // ver acumulados de lluvia UltimoReg.lloviendo = data[1].registros[0].lluvia_actual; UltimoReg.lluvia_acu_hora = data[1].registros[0].lluvia_acumulado_hora; UltimoReg.lluvia_acu_diaria = data[1].registros[0].lluvia_acumulado_diario; UltimoReg.lluvia_acumulado_total = data[1].registros[0].lluvia_acumulado_total; // Maximas y minimas, no llegan de EMACENTER, por el momento se setean en 0. UltimoReg.temperatura_externa_max_dia = 0; UltimoReg.temperatura_externa_min_dia = 0; UltimoReg.temperatura_interna_max_dia = 0; UltimoReg.temperatura_interna_min_dia = 0; UltimoReg.punto_de_rocio_max_dia = 0; UltimoReg.punto_de_rocio_min_dia = 0; UltimoReg.humedad_externa_max_dia = 0; UltimoReg.humedad_externa_min_dia = 0; UltimoReg.humedad_interna_max_dia = 0; UltimoReg.humedad_interna_min_dia = 0; UltimoReg.luxer_intencidad_max_dia = 0; UltimoReg.luxer_intencidad_min_dia = 0; UltimoReg.luxer_uv_max_dia = 0; UltimoReg.luxer_uv_min_dia = 0; UltimoReg.presion_relativa_max_dia = 0; UltimoReg.presion_relativa_min_dia = 0; tiempovisor = tiempovisor - 0.2; } }); } EstadoEMA = null; } async function RegistroActual (barratermino) { //console.log('ENTRO REGISTRO ACTUAL'); if (['Recolector_USB', 'Recolector_IP'].includes(configGeneralEMA.ConfGeneral.Modo)) { // se comprueba el modo se encuentra en Recolector if(barratermino == true){ //BARRA TERMINO await esperar(100); EstadoMenuInicio(); await esperar(100); if (win.x > -10000) MuestraRegistroActual(true); await esperar(100); if (win.x > -10000) Graficos(); await esperar(100); if (win.x > -10000) ClimaActual(); await esperar(1500); if (win.x > -10000) RegistroPublicado(); cant=0; } var EstadoEMA = EMA.Estado(); if (EstadoEMA[0] === true) { $('#img_detalle').attr('src', iconoControlTrue); $('#img_mensaje').attr('src', iconoControlTrue); if(configGeneralEMA.ConfGeneral.Modo === "Recolector_IP") { $('#mensaje').html('Recolectado por IP.'); }else{ $('#mensaje').html('Recolectando.'); $('#mensajedetalle').html('Operando.'); } controlPendientes(); UltimoReg = EMA.UltimoRegistro(); var EstadoSensores = EMA.EstadoSensores(); if(EstadoSensores !== false) { mostrarEstados(EstadoSensores);}else{EstadoSensores=null;} if (UltimoReg == false) { // Se consulta por la cantidad de errores if (EMA.RepeticionesConError() > 3) { if(configGeneralEMA.ConfGeneral.Modo === "Recolector_IP") { $('#mensaje').html('Recolectado por IP.'); $('#img_mensaje').attr('src', iconoNeutro); $('#mensajedetalle').html('(' + EMA.RepeticionesConError() + ') Sincronizando ...'); // HABLA(0, 'No se pueden obtener registros (Intentos ' + EMA.RepeticionesConError() + '). Revise por favor su configuración IP/WIFI de la estación.', 'error'); EMA.Configuracion.RepeticionesConError += 1; await esperar(5000); } else{ $('#img_mensaje').attr('src', iconoNeutro); $('#img_detalle').attr('src', iconoNeutro); HABLA(0, 'No se pueden obtener registros (Intentos ' + EMA.RepeticionesConError() + '). Desconecte y vuelva a conectar el USB. Se prueba reiniciar el servicio.', 'error'); await esperar(15000); DETENER(); await esperar(5000); INICIAR(); } RegistroActual(); return false; } else { $('#mensajedetalle').html('(' + EMA.RepeticionesConError() + ') Sincronizando ...'); if(configGeneralEMA.ConfGeneral.Modo === "Recolector_IP") EMA.Configuracion.RepeticionesConError += 1; $('#img_detalle').attr('src', iconoNeutro); await esperar(2000); RegistroActual(); return false; } } } else { $('#mensaje').html('EmaLibre detenida.'); $('#img_mensaje').attr('src', iconoControlFalse); $('#mensajedetalle').html(EstadoEMA[1]); $('#img_detalle').attr('src', iconoControlFalse); await esperar(5000); RegistroActual(); return false; } } else { // Modo visor if(barratermino == true){ //BARRA TERMINO await esperar(100); EstadoMenuInicio(); await esperar(100); if (win.x > -10000) MuestraRegistroActual(true); await esperar(100); if (win.x > -10000) Graficos(); await esperar(100); if (win.x > -10000) ClimaActual(); cant=0; } $('#signal').attr('src', '../gui_common/img/visor.webp'); var cantreg = 1; EMA.Visor(cantreg, function (error, datos) { if (error != null) { HABLA(0, 'No se pueden obtener datos del servidor. ' + error, 'info'); $('#signal').removeClass('parpadea'); setTimeout(function(){RegistroActual();}, 10000); } else { $('#signal').addClass('parpadea'); var DIVModo = document.getElementById('DIVModo'); DIVModo.style.visibility = 'visible'; document.getElementById('DIVModo').innerHTML = " Modo Visor
" + datos.pais + ', ' + datos.ciudad + "
" + datos.modelo + ''; UltimoReg = datos.registros[0]; ModeloVisor = datos.nombre; // se convierte la fecha var db = new Date(datos.registros[0].fecha); var minutos = db.getMinutes(); if (minutos <= 9) { minutos = '0' + minutos; } var hora = db.getHours(); if (hora <= 9) { hora = '0' + hora; } var mes = db.getMonth() + 1; if (mes <= 9) { mes = '0' + mes; } var dia = db.getDate(); if (dia <= 9) { dia = '0' + dia; } var segundo = db.getSeconds(); if (segundo <= 9) { segundo = '0' + segundo; } var fecha = dia + '/' + mes + '/' + db.getFullYear() + ' ' + hora + ':' + minutos + ':' + segundo; UltimoReg.fecha = fecha; fecha=null;dia=null;mes=null;segundo=null;minutos=null;hora=null;db=null; // ver acumulados de lluvia UltimoReg.lloviendo = datos.registros[0].lluvia_actual; UltimoReg.lluvia_acu_hora = datos.registros[0].lluvia_acumulado_hora; UltimoReg.lluvia_acu_diaria = datos.registros[0].lluvia_acumulado_diario; UltimoReg.lluvia_acumulado_total = datos.registros[0].lluvia_acumulado_total; // Maximas y minimas, no llegan de EMACENTER, por el momento se setean en 0. UltimoReg.temperatura_externa_max_dia = 0; UltimoReg.temperatura_externa_min_dia = 0; UltimoReg.temperatura_interna_max_dia = 0; UltimoReg.temperatura_interna_min_dia = 0; UltimoReg.punto_de_rocio_max_dia = 0; UltimoReg.punto_de_rocio_min_dia = 0; UltimoReg.humedad_externa_max_dia = 0; UltimoReg.humedad_externa_min_dia = 0; UltimoReg.humedad_interna_max_dia = 0; UltimoReg.humedad_interna_min_dia = 0; UltimoReg.luxer_intencidad_max_dia = 0; UltimoReg.luxer_intencidad_min_dia = 0; UltimoReg.luxer_uv_max_dia = 0; UltimoReg.luxer_uv_min_dia = 0; UltimoReg.presion_relativa_max_dia = 0; UltimoReg.presion_relativa_min_dia = 0; tiempovisor = tiempovisor - 0.2; } }); } EstadoEMA = null; } async function BarradeProgreso () { // const startTime = performance.now(); // Se consulta el tiempo actual del recolector if (configGeneralEMA.ConfGeneral.Modo != 'Visor') { // EN MODO RECOLECTOR IP o USB // Se pregunta si esta nativo o web var tiempoActualRecolector; if (!_IS_NW) { $.get("/TiempoActualRecolector", function(data, status){ tiempoActualRecolector = data; if(tiempoActualRecolector[0] !== false || tiempoActualRecolector[1] > 0) { if ((tiempoActualRecolector[0] < 98 && tiempoActualRecolector[1] > 0.39) ) { // CONTINUA ADENTRO NProgress.set(tiempoActualRecolector[0]/100); return false; } else { // Cuando termine cada barra, publica y luego vuelve al leer el registro actual cant++; if(cant == 1){ RegistroActualW(true);} else{return true;}; // solo si esta en modo visor if (configGeneralEMA.ConfGeneral.Modo === 'Visor') {document.getElementById('RedesMet').innerHTML = "" + ModeloVisor + ': ' + UltimoReg.fecha.substring(10, 20) + '
';} NProgress.done(); } }else{ if(cant > 0){enEjecucion = false;return false;} NProgress.done(); } }); } else { tiempoActualRecolector = EMA.TiempoActualRecolector(); // console.log(tiempoActualRecolector); if(tiempoActualRecolector[0] !== false || tiempoActualRecolector[1] > 0) { if ((tiempoActualRecolector[0] < 98 && tiempoActualRecolector[1] > 0.39) ) { // CONTINUA ADENTRO if (win.x > -10000) { // Solo si no esta minimizado NProgress.set(tiempoActualRecolector[0]/100); return false; } } else { // Cuando termine cada barra, publica y luego vuelve al leer el registro actual cant++; if(cant == 1){ RegistroActual(true);} else{return true;}; // solo si esta en modo visor if (configGeneralEMA.ConfGeneral.Modo === 'Visor') {document.getElementById('RedesMet').innerHTML = "" + ModeloVisor + ': ' + UltimoReg.fecha.substring(10, 20) + '
';} if (win.x > -10000) { // Solo si no esta minimizado NProgress.done(); } } }else{ if(cant > 0){return false;} if (win.x > -10000) { // Solo si no esta minimizado NProgress.done(); } } } } else { // MODO VISOR if( tiempovisor != 99) { if( tiempovisor >= configGeneralEMA.ConfGeneral.Tiempo_de_Recoleccion) { tiempovisor = 0; if (_IS_NW) { RegistroActual(true);}else{RegistroActualW(true);} if (win.x > -10000) NProgress.done(); }else{ tiempovisor = tiempovisor + 0.2; // se le suma el tiempo del intervalo var tiempo_barra = ((tiempovisor * 100) / configGeneralEMA.ConfGeneral.Tiempo_de_Recoleccion)/100; if (win.x > -10000) NProgress.set(tiempo_barra); } } } UltimoPub = null;aux=null;tiempoActualRecolector = null; tiempo_barra = null; /* const duration = performance.now() - startTime; console.log(` Tiempo barra: ${duration}ms`);*/ } // ********************** Menu Acciones ******************************************************************* async function MenuConfig () { $('#bloque_secundario').hide(); $('#LlaveR').hide(); $('#bloque_por_IP_WIFI').hide(); if (['Recolector_USB', 'Recolector_IP'].includes($('#Modo').val())) { $('#LlaveR').attr('disabled', true); $('#LlaveR').val(''); if ($('#Modo').val() === 'Recolector_USB') { //nada por ahora :). }else{ //esta en modo Recolector_IP //console.log("entro en modo IP"); $('#bloque_secundario').show(); $('#bloque_por_IP_WIFI').show(); let interfaces; if (_IS_NW) { interfaces = os.networkInterfaces(); } else {interfaces = await $.get('/interfaces');} // Limpiar las opciones previas (excepto la de "Seleccionar IP") const $ipGroup = $('#ipGroup'); $ipGroup.find('option:not([value=""])').remove(); // Recorremos las interfaces de red let ipEncontrada = false; for (const name in interfaces) { for (const iface of interfaces[name]) { if (iface.family === 'IPv4' && !iface.internal) { const $option = $('