From 2d4c7b5f3676ffd3cbe435cae54c15b8d26d19e3 Mon Sep 17 00:00:00 2001 From: Exequiel Aramburu Date: Sun, 16 Nov 2025 19:35:43 -0300 Subject: [PATCH] save --- .gitignore | 6 +- empaquetarLinux.js | 42 +- generarDeb64.sh | 150 +- generarDebArm.sh | 49 - package-lock.json | 579 +- src/CHANGELOG | 6 +- src/conf/ConfiguracionGeneral.js | 17 +- src/core/ema.js | 319 +- src/core/recolector.js | 6 +- src/core/redes/windy.js | 60 +- src/gui/controlador/funcionesgenerales.js | 429 +- src/gui/controlador/inicio.js | 9 +- src/gui/index.html | 50 +- src/gui/view/modelo_contacto.html | 9 +- src/gui/view/modelo_estadisticas.html | 7 +- src/gui/view/modelo_inicio.html | 8 +- .../controlador/admingui.js | 595 +- src/gui_common/css/style.css | 15 +- src/gui_common/img/informacion.png | Bin 0 -> 4701 bytes src/gui_common/libs/RGraph/RGraph.bar.js | 4628 ++ .../libs/RGraph/RGraph.common.core.js | 1961 +- .../libs/RGraph/RGraph.drawing.image.js | 205 +- src/gui_common/libs/RGraph/RGraph.gauge.js | 339 +- src/gui_common/libs/RGraph/RGraph.odo.js | 250 +- .../libs/RGraph/RGraph.thermometer.js | 178 +- src/gui_web/controlador/admingui.js | 743 - src/gui_web/controlador/funcionesgenerales.js | 150 +- src/gui_web/express.js | 80 +- src/gui_web/index.html | 48 +- src/gui_web/view/modelo_configuracion.html | 436 +- src/gui_web/view/modelo_contacto.html | 20 +- src/gui_web/view/modelo_estadisticas.html | 7 +- src/gui_web/view/modelo_exterior.html | 20 +- src/gui_web/view/modelo_historico.html | 2 +- src/gui_web/view/modelo_inicio.html | 22 +- src/gui_web/view/modelo_logs.html | 2 +- src/logs/debug.log | 40987 ++++++++++------ src/logs/registro_diario.log | 12245 ++--- src/package-lock.json | 43 +- src/package.json | 7 +- test/Send_GET.py | 10 +- 41 files changed, 40812 insertions(+), 23927 deletions(-) rename src/{gui => gui_common}/controlador/admingui.js (57%) create mode 100644 src/gui_common/img/informacion.png create mode 100644 src/gui_common/libs/RGraph/RGraph.bar.js delete mode 100644 src/gui_web/controlador/admingui.js diff --git a/.gitignore b/.gitignore index 3c3629e..43caf9d 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,5 @@ -node_modules +node_modules/ +cache/ +build/tmp/emalibre_nogui/ +build/debs/* +!build/debs/readme.md diff --git a/empaquetarLinux.js b/empaquetarLinux.js index df19729..0499be1 100644 --- a/empaquetarLinux.js +++ b/empaquetarLinux.js @@ -1,28 +1,18 @@ -(async () => { - try { - // 📦 Cargar la función principal desde nw-builder - const nwbuild = (await import('nw-builder')).default; +import nwbuild from 'nw-builder'; - // 🚀 Configuración del build - await nwbuild({ - mode: 'build', // COMPILADOR: Modo 'build' (empaquetar) o 'run' (ejecutar sin empaquetar) - srcDir: [ - './src/**', // COMPILADOR: Directorio fuente - '!./src/node_module/mocha/**', // EXCEPCIÓN: Excluir pruebas - '!./src/node_module/chai/**', - '!./src/package-lock.json' - ], - platform: 'linux', // COMPILADOR: Plataforma de destino - arch: 'x64', // COMPILADOR: Arquitectura de destino - version: '0.94.0', // COMPILADOR: Versión de NW.js a usar - flavor: 'normal', // COMPILADOR: Variante NW.js ('normal' o 'sdk') - outDir: 'build/emalibre', // COMPILADOR: Carpeta de salida - appName: 'emalibre', // APLICACIÓN: Nombre de la app compilada - zip: false, // COMPILADOR: No comprimir - }); - console.log('Correcto!'); - } catch (error) { - console.error('❌ Error durante la compilación:', error); - } -})(); \ No newline at end of file +// 3. Configurar nw-builder para usar el directorio temporal como appDir +await nwbuild({ + srcDir: './src', // Usamos el directorio temporal como fuente + file: './src/package.json', + platforms: ['linux64'], + glob: false, + version: '0.94.0', + flavor: 'normal', + buildDir: './build/emalibre', + outDir: './build/emalibre', + zip: false, + appName: 'emalibre' +}); + +console.log('Correcto!'); diff --git a/generarDeb64.sh b/generarDeb64.sh index 66ce53c..82c62dc 100755 --- a/generarDeb64.sh +++ b/generarDeb64.sh @@ -41,9 +41,10 @@ printf "\033[1;4m--->Version de EmaL: $VERSION \033[0m\n" printf "\033[1;4m--->Version de NWJs: $NWJS_VERSION \033[0m\n" echo "" printf "\033[1;10m1) Limpiando compilacion anterior. \033[0m" -sudo mkdir build/Deb64/usnerando node_modules con NPM del proyr/bin 2> /dev/null +sudo mkdir build/Deb64/usr/bin 2> /dev/null sudo mkdir build/Deb64/usr/share/emalibre 2> /dev/null -sudo rm -fr build/emalibre/package.nw/src +sudo rm -fr build/emalibre/* +sudo rm -fr build/tmp/emalibre_nogui sudo rm -fr build/Deb64/usr/bin/* sudo rm -fr build/Deb64/usr/share/emalibre/* printf "\033[1;32m --> OK. \033[0m\n" @@ -61,7 +62,7 @@ then printf "\033[1;32m --> Se sale, por favor instale manualmente. \033[0m\n" exit 0 fi -printf "\033[1;10m 3.2) Comprobando si esta npm global. \033[0m" +printf "\033[1;10m 3.2) Comprobando si esta /npm global. \033[0m" if [ $npm -eq 1 ] then printf "\033[1;32m --> OK. \033[0m\n" @@ -92,13 +93,13 @@ printf "\033[1;10m4) Empaquetando el proyecto emalibre. \033[0m" CHECK_EMPAQUETADO=`node empaquetarLinux.js | grep "Correcto!" | wc -l` if [ "${CHECK_EMPAQUETADO}" -eq "1" ]; then printf "\033[1;32m --> OK. \033[0m\n"; else printf "\033[5;91m --> ERROR. Problema empaquetando con nw-builder. \033[0m\n";exit 1; fi printf "\033[1;10m5) Aplicando Permisos al proyecto. \033[0m" -sudo chmod -R 777 build/emalibre/package.nw/src & spinner "Procesando..." +sudo chmod -R 777 build/emalibre/package.nw & spinner "Procesando..." printf "\033[1;32m --> OK. \033[0m\n" printf "\033[1;10m6) Eliminando node_modules del proyecto. \033[0m" -sudo rm -fr build/emalibre/package.nw/src/node_modules & spinner "Procesando..." +sudo rm -fr build/emalibre/package.nw/node_modules & spinner "Procesando..." printf "\033[1;32m --> OK. \033[0m\n" printf "\033[1;10m7) Generando node_modules con NPM del proyecto. \033[0m" -cd build/emalibre/package.nw/src +cd build/emalibre/package.nw npm install ---production -no-audit -silent 2> /tmp/ema.log 1> /dev/null printf "\033[1;32m --> OK. \033[0m\n"; printf "\033[1;10m8) Se purgan los tanques y logs. \033[0m" @@ -107,16 +108,16 @@ sudo echo "[]" > logs/TanquePendientes.log sudo echo "[]" > logs/registro_diario.log printf "\033[1;32m --> OK. \033[0m\n"; printf "\033[1;10m9) Se blanquea el archivo de Configuracion General. \033[0m" -sudo cp ../../../conf/ConfiguracionGeneral.js conf/ConfiguracionGeneral.js +sudo cp ../../conf/ConfiguracionGeneral.js conf/ConfiguracionGeneral.js printf "\033[1;32m --> OK. \033[0m\n"; -cd .. -sudo cp -R src src_nogui # Se copia antes del postLINUX (que implementa NWJS) para el modo consola y web -sudo chmod -R 777 src_nogui -cd src +cd ../.. +sudo cp -R emalibre tmp/emalibre_nogui # Se copia antes del postLINUX (que implementa NWJS) para el modo consola y web +sudo chmod -R 777 tmp/emalibre_nogui +cd emalibre/package.nw npm run postLINUX -no-audit -silent 2> /tmp/ema.log 1> /dev/null & spinner "Procesando..." CHECK_NW_NODE_BUILD=`cat /tmp/ema.log | grep "gyp info ok" | wc -l` if [ "${CHECK_NW_NODE_BUILD}" -eq "1" ]; then printf "\033[1;32m --> OK. \033[0m\n"; else printf "\033[5;91m --> ERROR. Verifique el modulo NW con node-hid. \033[0m\n";exit 1; fi -cd ../../../.. +cd ../../.. # ************************************************************** # Compilar EMA Libre Cliente (Carpincho) en modo GRAFICO Desktop @@ -176,6 +177,60 @@ sudo rm -fr build/Deb64/usr/bin/* sudo rm -fr build/Deb64/usr/share/emalibre/* printf "\033[1;32m --> OK. \033[0m\n" + +# *********************************************************** +# Compilar EMA Libre Cliente (Carpincho) en modo CONSOLA/WEB +# *********************************************************** +echo "" +echo "" +echo "*************************************************" +echo "* Build EMA Libre Cliente Web - GNU/Linux *" +echo "*************************************************" +echo "" +printf "\033[1;10m1) Limpiando archivos temporales. \033[0m" +sudo rm -f build/Deb64/DEBIAN/control +sudo rm -fr build/Deb64/usr/bin/* +sudo rm -fr build/Deb64/usr/share/emalibre/* +printf "\033[1;32m --> OK. \033[0m\n" +printf "\033[1;10m2) Copiando los fuentes de EMA Libre para 64bit. \033[0m" +sudo cp -R build/tmp/emalibre_nogui/package.nw/core build/Deb64/usr/share/emalibre/ +sudo cp -R build/tmp/emalibre_nogui/package.nw/logs build/Deb64/usr/share/emalibre/ +sudo cp -R build/tmp/emalibre_nogui/package.nw/conf build/Deb64/usr/share/emalibre/ +sudo cp -R build/tmp/emalibre_nogui/package.nw/gui_web build/Deb64/usr/share/emalibre/ +sudo cp -R build/tmp/emalibre_nogui/package.nw/gui_common build/Deb64/usr/share/emalibre/ +sudo cp -R build/tmp/emalibre_nogui/package.nw/node_modules build/Deb64/usr/share/emalibre/ +sudo cp -R build/tmp/emalibre_nogui/package.nw/CHANGELOG build/Deb64/usr/share/emalibre/ +sudo cp -R build/tmp/emalibre_nogui/package.nw/COPYING build/Deb64/usr/share/emalibre/ +sudo cp -R build/tmp/emalibre_nogui/package.nw/AUTHORS build/Deb64/usr/share/emalibre/ +sudo cp -R build/tmp/emalibre_nogui/package.nw/package.json build/Deb64/usr/share/emalibre/ +printf "\033[1;32m --> OK. \033[0m\n" +printf "\033[1;10m3) Remplazando el archivo de control DEB. \033[0m" +sudo cp -f build/controlDeb/control_linux_web build/Deb64/DEBIAN/control & spinner "Procesando..." +printf "\033[1;32m --> OK. \033[0m\n" +printf "\033[1;10m4) Aplicando permisos necesarios. \033[0m" +sudo echo "web" > build/Deb64/etc/emalibre_modo +sudo chmod 0755 build/Deb64/DEBIAN +sudo chmod 0755 build/Deb64/DEBIAN/postrm +sudo chmod 0755 build/Deb64/DEBIAN/postinst +sudo chmod 0755 build/Deb64/DEBIAN/preinst +sudo chown -R root:root build/Deb64 +printf "\033[1;32m --> OK. \033[0m\n" +cd build +printf "\033[1;10m7) Generando Paquete Deb para Web 64bit Linux. \033[0m\n" +sudo dpkg -b Deb64 debs/"emalibre-web-linux_$VERSION.deb" +printf "\033[5;10m Finalizo con exito, build/debs/emalibre-console-linux_$VERSION.deb. \033[0m" +printf "\033[1;32m --> OK. \033[0m\n" +printf "\033[1;10m8) Limpiando archivos temporales. \033[0m" +cd .. +sudo rm -f build/Deb64/DEBIAN/control +sudo rm -fr build/Deb64/usr/bin/* +sudo rm -fr build/Deb64/usr/share/emalibre/* +sudo rm -fr build/emalibre +printf "\033[1;32m --> OK. \033[0m\n" +echo "" + +exit 0 + # *********************************************************** # Compilar EMA Libre Cliente (Carpincho) en modo CONSOLA # *********************************************************** @@ -191,15 +246,15 @@ sudo rm -fr build/Deb64/usr/bin/* sudo rm -fr build/Deb64/usr/share/emalibre/* printf "\033[1;32m --> OK. \033[0m\n" printf "\033[1;10m2) Copiando los fuentes de EMA Libre para 64bit. \033[0m" -sudo cp -R build/emalibre/package.nw/src_nogui/core build/Deb64/usr/share/emalibre/ -sudo cp -R build/emalibre/package.nw/src_nogui/logs build/Deb64/usr/share/emalibre/ -sudo cp -R build/emalibre/package.nw/src_nogui/conf build/Deb64/usr/share/emalibre/ -sudo cp -R build/emalibre/package.nw/src_nogui/tmp build/Deb64/usr/share/emalibre/ -sudo cp -R build/emalibre/package.nw/src_nogui/node_modules build/Deb64/usr/share/emalibre/ -sudo cp -R build/emalibre/package.nw/src_nogui/CHANGELOG build/Deb64/usr/share/emalibre/ -sudo cp -R build/emalibre/package.nw/src_nogui/COPYING build/Deb64/usr/share/emalibre/ -sudo cp -R build/emalibre/package.nw/src_nogui/AUTHORS build/Deb64/usr/share/emalibre/ -sudo cp -R build/emalibre/package.nw/src_nogui/package.json build/Deb64/usr/share/emalibre/ +sudo cp -R build/tmp/emalibre_nogui/core build/Deb64/usr/share/emalibre/ +sudo cp -R build/tmp/emalibre_nogui/logs build/Deb64/usr/share/emalibre/ +sudo cp -R build/tmp/emalibre_nogui/conf build/Deb64/usr/share/emalibre/ +sudo cp -R build/tmp/emalibre_nogui/tmp build/Deb64/usr/share/emalibre/ +sudo cp -R build/tmp/emalibre_nogui/node_modules build/Deb64/usr/share/emalibre/ +sudo cp -R build/tmp/emalibre_nogui/CHANGELOG build/Deb64/usr/share/emalibre/ +sudo cp -R build/tmp/emalibre_nogui/COPYING build/Deb64/usr/share/emalibre/ +sudo cp -R build/tmp/emalibre_nogui/AUTHORS build/Deb64/usr/share/emalibre/ +sudo cp -R build/tmp/emalibre_nogui/package.json build/Deb64/usr/share/emalibre/ printf "\033[1;32m --> OK. \033[0m\n" printf "\033[1;10m3) Remplazando el archivo de control DEB. \033[0m" sudo cp -f build/controlDeb/control_linux_console build/Deb64/DEBIAN/control & spinner "Procesando..." @@ -223,56 +278,3 @@ sudo rm -fr build/Deb64/usr/bin/* sudo rm -fr build/Deb64/usr/share/emalibre/* printf "\033[1;32m --> OK. \033[0m\n" echo "" - -# *********************************************************** -# Compilar EMA Libre Cliente (Carpincho) en modo CONSOLA/WEB -# *********************************************************** -echo "" -echo "" -echo "*************************************************" -echo "* Build EMA Libre Cliente Web - GNU/Linux *" -echo "*************************************************" -echo "" -printf "\033[1;10m1) Limpiando archivos temporales. \033[0m" -sudo rm -f build/Deb64/DEBIAN/control -sudo rm -fr build/Deb64/usr/bin/* -sudo rm -fr build/Deb64/usr/share/emalibre/* -printf "\033[1;32m --> OK. \033[0m\n" -printf "\033[1;10m2) Copiando los fuentes de EMA Libre para 64bit. \033[0m" -sudo cp -R build/emalibre/package.nw/src_nogui/core build/Deb64/usr/share/emalibre/ -sudo cp -R build/emalibre/package.nw/src_nogui/logs build/Deb64/usr/share/emalibre/ -sudo cp -R build/emalibre/package.nw/src_nogui/conf build/Deb64/usr/share/emalibre/ -sudo cp -R build/emalibre/package.nw/src_nogui/gui_web build/Deb64/usr/share/emalibre/ -sudo cp -R build/emalibre/package.nw/src_nogui/gui_common build/Deb64/usr/share/emalibre/ -sudo cp -R build/emalibre/package.nw/src_nogui/tmp build/Deb64/usr/share/emalibre/ -sudo cp -R build/emalibre/package.nw/src_nogui/node_modules build/Deb64/usr/share/emalibre/ -sudo cp -R build/emalibre/package.nw/src_nogui/CHANGELOG build/Deb64/usr/share/emalibre/ -sudo cp -R build/emalibre/package.nw/src_nogui/COPYING build/Deb64/usr/share/emalibre/ -sudo cp -R build/emalibre/package.nw/src_nogui/AUTHORS build/Deb64/usr/share/emalibre/ -sudo cp -R build/emalibre/package.nw/src_nogui/package.json build/Deb64/usr/share/emalibre/ -printf "\033[1;32m --> OK. \033[0m\n" -printf "\033[1;10m3) Remplazando el archivo de control DEB. \033[0m" -sudo cp -f build/controlDeb/control_linux_web build/Deb64/DEBIAN/control & spinner "Procesando..." -printf "\033[1;32m --> OK. \033[0m\n" -printf "\033[1;10m4) Aplicando permisos necesarios. \033[0m" -sudo echo "web" > build/Deb64/etc/emalibre_modo -sudo chmod 0755 build/Deb64/DEBIAN -sudo chmod 0755 build/Deb64/DEBIAN/postrm -sudo chmod 0755 build/Deb64/DEBIAN/postinst -sudo chmod 0755 build/Deb64/DEBIAN/preinst -sudo chown -R root:root build/Deb64 -printf "\033[1;32m --> OK. \033[0m\n" -cd build -printf "\033[1;10m7) Generando Paquete Deb para Web 64bit Linux. \033[0m\n" -sudo dpkg -b Deb64 demalibreebs/"emalibre-web-linux_$VERSION.deb" -printf "\033[5;10m Finalizo con exito, build/debs/emalibre-console-linux_$VERSION.deb. \033[0m" -printf "\033[1;32m --> OK. \033[0m\n" -printf "\033[1;10m8) Limpiando archivos temporales. \033[0m" -cd .. -sudo rm -f build/Deb64/DEBIAN/control -sudo rm -fr build/Deb64/usr/bin/* -sudo rm -fr build/Deb64/usr/share/emalibre/* -sudo rm -fr build/emalibre -printf "\033[1;32m --> OK. \033[0m\n" -echo "" - diff --git a/generarDebArm.sh b/generarDebArm.sh index f9140f4..c94540e 100755 --- a/generarDebArm.sh +++ b/generarDebArm.sh @@ -204,55 +204,6 @@ sudo rm -fr build/Deb64/usr/bin/* sudo rm -fr build/Deb64/usr/share/emalibre/* printf "\033[1;32m --> OK. \033[0m\n" -# *********************************************************** -# Compilar EMA Libre Cliente (Carpincho) en modo CONSOLA -# *********************************************************** -echo "" -echo "" -echo "*************************************************" -echo "* Build EMA Libre Cliente Consola - ARM *" -echo "*************************************************" -echo "" -printf "\033[1;10m1) Limpiando archivos temporales. \033[0m" -sudo rm -f build/Deb64/DEBIAN/control -sudo rm -fr build/Deb64/usr/bin/* -sudo rm -fr build/Deb64/usr/share/emalibre/* -printf "\033[1;32m --> OK. \033[0m\n" -printf "\033[1;10m2) Copiando los fuentes de EMA Libre para ARM. \033[0m" -sudo cp -R build/emalibre/arm/core build/Deb64/usr/share/emalibre/ -sudo cp -R build/emalibre/arm/logs build/Deb64/usr/share/emalibre/ -sudo cp -R build/emalibre/arm/conf build/Deb64/usr/share/emalibre/ -sudo cp -R build/emalibre/arm/tmp build/Deb64/usr/share/emalibre/ -sudo cp -R build/emalibre/arm/node_modules build/Deb64/usr/share/emalibre/ -sudo rm -fr build/Deb64/usr/share/emalibre/node_modules/node-hid -sudo cp -R build/emalibre/node-hid build/Deb64/usr/share/emalibre/node_modules -sudo cp -R build/emalibre/arm/CHANGELOG build/Deb64/usr/share/emalibre/ -sudo cp -R build/emalibre/arm/COPYING build/Deb64/usr/share/emalibre/ -sudo cp -R build/emalibre/arm/AUTHORS build/Deb64/usr/share/emalibre/ -sudo cp -R build/emalibre/arm/package.json build/Deb64/usr/share/emalibre/ -printf "\033[1;32m --> OK. \033[0m\n" -printf "\033[1;10m3) Remplazando el archivo de control DEB. \033[0m" -sudo cp -f build/controlDeb/control_arm_console build/Deb64/DEBIAN/control & spinner "Procesando..." -printf "\033[1;32m --> OK. \033[0m\n" -printf "\033[1;10m4) Aplicando permisos necesarios. \033[0m" -sudo chmod 0755 build/Deb64/DEBIAN -sudo chmod 0755 build/Deb64/DEBIAN/postrm -sudo chmod 0755 build/Deb64/DEBIAN/postinst -sudo chmod 0755 build/Deb64/DEBIAN/preinst -sudo chown -R root:root build/Deb64 -printf "\033[1;32m --> OK. \033[0m\n" -cd build -printf "\033[1;10m7) Generando Paquete Deb para Consola ARM. \033[0m\n" -sudo dpkg -b Deb64 debs/"emalibre-consola-arm_$VERSION.deb" -printf "\033[5;10m Finalizo con exito, build/debs/emalibre-console-arm_$VERSION.deb. \033[0m" -printf "\033[1;32m --> OK. \033[0m\n" -printf "\033[1;10m8) Limpiando archivos temporales. \033[0m" -cd .. -sudo rm -f build/Deb64/DEBIAN/control -sudo rm -fr build/Deb64/usr/bin/* -sudo rm -fr build/Deb64/usr/share/emalibre/* -printf "\033[1;32m --> OK. \033[0m\n" -echo "" # *********************************************************** # Compilar EMA Libre Cliente (Carpincho) en modo CONSOLA/WEB diff --git a/package-lock.json b/package-lock.json index b7806e9..54f909d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,15 +13,6 @@ "nw-builder": "^4.13.16" } }, - "node_modules/@babel/runtime": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz", - "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@emnapi/core": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.4.tgz", @@ -550,12 +541,12 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/ansi-styles": { @@ -896,18 +887,6 @@ "node": ">= 0.4" } }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/chai": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", @@ -1007,6 +986,50 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1069,9 +1092,9 @@ "dev": true }, "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, "node_modules/crc-32": { @@ -1545,21 +1568,23 @@ } }, "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", + "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.0.3", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": "*" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -1577,6 +1602,61 @@ "node": ">= 6" } }, + "node_modules/glob/node_modules/jackspeak": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/lru-cache": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", + "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", + "dev": true, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "dev": true, + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/globalthis": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", @@ -1832,12 +1912,12 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/is-glob": { @@ -1853,12 +1933,11 @@ } }, "node_modules/is-it-type": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/is-it-type/-/is-it-type-5.1.2.tgz", - "integrity": "sha512-q/gOZQTNYABAxaXWnBKZjTFH4yACvWEFtgVOj+LbgxYIgAJG1xVmUZOsECSrZPIemYUQvaQWVilSFVbh4Eyt8A==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/is-it-type/-/is-it-type-5.1.3.tgz", + "integrity": "sha512-AX2uU0HW+TxagTgQXOJY7+2fbFHemC7YFBwN1XqD8qQMKdtfbOC8OC3fUb4s5NU59a3662Dzwto8tWDdZYRXxg==", "dev": true, "dependencies": { - "@babel/runtime": "^7.16.7", "globalthis": "^1.0.2" }, "engines": { @@ -1895,6 +1974,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -1946,12 +2031,6 @@ "node": ">= 0.6.3" } }, - "node_modules/lazystream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, "node_modules/lazystream/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -1967,12 +2046,6 @@ "util-deprecate": "~1.0.1" } }, - "node_modules/lazystream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, "node_modules/lazystream/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -2293,6 +2366,27 @@ "url": "https://opencollective.com/mochajs" } }, + "node_modules/mocha/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -2414,84 +2508,6 @@ "nwbuild": "src/cli.js" } }, - "node_modules/nw-builder/node_modules/glob": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", - "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", - "dev": true, - "dependencies": { - "foreground-child": "^3.3.1", - "jackspeak": "^4.1.1", - "minimatch": "^10.0.3", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/nw-builder/node_modules/jackspeak": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", - "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/nw-builder/node_modules/lru-cache": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", - "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", - "dev": true, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/nw-builder/node_modules/minimatch": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", - "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", - "dev": true, - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/nw-builder/node_modules/path-scurry": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", - "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", - "dev": true, - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -2796,24 +2812,10 @@ } }, "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/safer-buffer": { "version": "2.1.2", @@ -2980,18 +2982,37 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/string-width-cjs": { @@ -3009,7 +3030,25 @@ "node": ">=8" } }, - "node_modules/strip-ansi": { + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", @@ -3021,6 +3060,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", @@ -3034,6 +3085,15 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -3129,9 +3189,9 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "engines": { "node": ">=12" @@ -3222,49 +3282,6 @@ "string-width": "^1.0.2 || 2" } }, - "node_modules/wide-align/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/workerpool": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", @@ -3306,6 +3323,94 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -3381,6 +3486,62 @@ "node": ">=10" } }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yauzl-promise": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yauzl-promise/-/yauzl-promise-4.0.0.tgz", diff --git a/src/CHANGELOG b/src/CHANGELOG index 0990e44..a31f057 100644 --- a/src/CHANGELOG +++ b/src/CHANGELOG @@ -4,8 +4,9 @@ + Se actualizó la funcion de registrar logs para que solo registre en el nivel parametrizado (1-9), los 0 se registran siempre. + Se mantiene la versión de nwjs por compatibilidad con node-hid. + + Se incorporó la opcion para ir al sitio oficial de la red, en el menu de redes. + Se actualizó la versión de : - RGraph 6.20 → 6.22 + RGraph 6.20 → 7.01 bootstrap 4.5.3 → 4.6.2 express 4.21.2 → 5.1.0 forever 3.0.4 → 4.0.3 @@ -13,6 +14,9 @@ node-hid 1.3.1 → 2.2.0 nodemailer 6.10.1 → 7.0.5 terminal-kit 2.11.7 → 3.1.2 ++ Se realizo un fix a la red WINDY(https://stations.windy.com/) para su publicación. + -Usuario/ID: es la API KEY del usuario. + -Password: Es numero de estaciones dada de alta en windy(ej: la primera->0, la segunda->1, la X->X). ** Versión 1.35: (Diciembre 10 , 2024) + Se actualizó la versión de nwjs → 0.94.0 diff --git a/src/conf/ConfiguracionGeneral.js b/src/conf/ConfiguracionGeneral.js index d37bb13..66a9835 100755 --- a/src/conf/ConfiguracionGeneral.js +++ b/src/conf/ConfiguracionGeneral.js @@ -2,25 +2,26 @@ module.exports = { "ConfGeneral": { - "Tiempo_de_Recoleccion": 10, + "Tiempo_de_Recoleccion": 40, "UTC": -3, "SistemaMetrico": "SI", - "debug": 6, + "debug": 3, "debugTamanio": 10, - "NombreEstacion": "pepe", - "Modo": "Recolector_IP", + "NombreEstacion": "-", + "Modo": "Recolector", "Llave_R": "e5303ab3-2a8b-4d42-90ab-1c8367d8521d", "inicio_automatico": false, - "Audio": false, - "notificar_cambios": true, - "audioVoces": "Sin Voces", + "Audio": true, + "notificar_cambios": true, + "audioVoces": "Spanish_(Latin_America) espeak-ng", "IP": "192.168.1.220", "Puerto": "5000", "Ruta": "/datos" + }, "ConfEmail": { "ActivarCorreos": false, - "ReceptorEmail": "exe", + "ReceptorEmail": "-", "Servicio": "Deshabilitado", "Usuario": "", "Password": "", diff --git a/src/core/ema.js b/src/core/ema.js index 3fe9b35..5d04cd6 100644 --- a/src/core/ema.js +++ b/src/core/ema.js @@ -105,8 +105,8 @@ APP = module.exports = { encoding: 'utf8', autoClose: true }, function (err) { - if (err) { APP.RegistrarLog('0|ERROR| 🔴 Depurando archivo registro de logs :' + err); } - APP.RegistrarLog('0|PURGADO| 🔴 Depurando automaticamente archivo registro de logs.'); + if (err) { APP.RegistrarLog('0|ERROR|🔴 Depurando archivo registro de logs :' + err); } + APP.RegistrarLog('0|PURGADO|🔴 Depurando automaticamente archivo registro de logs.'); }); } else { // GUARDA LOS REGISTROS DE LOGS @@ -116,7 +116,7 @@ APP = module.exports = { autoClose: true }, function (err) { if (err) { - APP.RegistrarLog('0|ERROR| 🔴 Guardando registro de logs en archivo :' + err); + APP.RegistrarLog('0|ERROR|🔴 Guardando registro de logs en archivo :' + err); } }); } @@ -142,14 +142,15 @@ APP = module.exports = { }, Salir: function () { - APP.RegistrarLog('0|CORE|SALIR: Se cerro el core de EMA LIBRE. Hasta luego!!!.'); + APP.RegistrarLog('0|CORE|🔚 SALIR: Se cerro el core de EMA LIBRE. Hasta luego!!!.'); if (configGeneralEMA.ConfEmail.ActivarCorreos === true) Correo.EnviarEmail(configGeneralEMA,'EMA - OFFLINE', 'Estimado,

Le informamos que la estación ' + configGeneralEMA.ConfGeneral.NombreEstacion + ' se detuvo y se cerro el software EMA LIBRE.

Saludos Cordiales.'); APP.Configuracion.Errores = 'Se Salio del Recolector'; }, Detener: function () { - APP.RegistrarLog('0|CORE|DETENER: Se detiene el recolector de EMA LIBRE.'); + APP.RegistrarLog('0|CORE|🔴 Se detiene el recolector de EMA LIBRE.'); APP.Configuracion.RunTime = 0; APP.Configuracion.Errores = 'Se detuvo manualmente el Recolector'; + APP.Configuracion.RepeticionesConError = 0; APP.LimpiarM(); if(APP.Configuracion.Modo === 'Recolector_IP') { @@ -159,29 +160,31 @@ APP = module.exports = { res.on('data', (chunk) => { }); res.on('end', () => { - APP.RegistrarLog('0|CORE| Petición de apagado enviada correctamente.'); + APP.RegistrarLog('0|CORE|🔴 Petición de apagado enviada correctamente.'); }); }).on('error', (err) => { - APP.RegistrarLog('0|CORE| ❌ Error al enviar petición'); + APP.RegistrarLog('0|CORE|❌ Error al enviar petición'); }); } }, Reconfigurar: function () { - APP.RegistrarLog('0|CORE|RECONFIGURANDO: Se reconfigura el recolectorde EMA LIBRE.'); + APP.RegistrarLog('0|CORE|⚙️ RECONFIGURANDO: Se reconfigura el recolectorde EMA LIBRE.'); if (configGeneralEMA.ConfEmail.ActivarCorreos === true) Correo.EnviarEmail(configGeneralEMA,'EMA - CONFIG', 'Estimado,

Le informamos que se modificó la configuración de la estación ' + configGeneralEMA.ConfGeneral.NombreEstacion + '.

Saludos Cordiales.'); APP.Configuracion.TiempoContinuo = configGeneralEMA.ConfGeneral.Tiempo_de_Recoleccion; APP.Configuracion.debug = configGeneralEMA.ConfGeneral.debug; recolector.conf.debug = configGeneralEMA.ConfGeneral.debug; + APP.Configuracion.Puerto = configGeneralEMA.ConfGeneral.Puerto; + APP.Configuracion.IP = configGeneralEMA.ConfGeneral.IP; + APP.Configuracion.Patch = configGeneralEMA.ConfGeneral.Ruta; }, Iniciar: function () { - APP.RegistrarLog('0|CORE|INICIAR:Iniciando.'); if (APP.Configuracion.Run === 1 && APP.Configuracion.RunTime === 0) { - APP.RegistrarLog('0|CORE|INICIAR: Se inicio el recolector de EMA LIBRE.'); - APP.RegistrarLog('0|CORE|DEBUG: ' + APP.Configuracion.debug); + APP.RegistrarLog('0|CORE|🟢 INICIAR: Se inicio el recolector.'); + APP.RegistrarLog('0|CORE|🛠️ DEBUG: ' + APP.Configuracion.debug); APP.Configuracion.RunTime = 1; if(APP.Configuracion.Modo != 'Recolector_IP') APP.Continuo(); } else { - APP.RegistrarLog('0|CORE|Hay un proceso corriendo, se elimina.'); + APP.RegistrarLog('0|CORE|🔄 Hay un proceso corriendo, se elimina.'); APP.LimpiarM(); if(APP.Configuracion.Modo != 'Recolector_IP') APP.Continuo(); } @@ -204,12 +207,13 @@ APP = module.exports = { autoClose: true }, (err) => { if (err) { - APP.RegistrarLog('1|ERROR: 🔴 Guardando registro diario en archivo :' + err); + APP.RegistrarLog('1|ERROR|🔴 Guardando registro diario en archivo :' + err); } }); }, - TiempoActualRecolector: function () { + TiempoActualRecolector: function (ahora = false) { + if(ahora) {return [100,100]; } // APP.RegistrarLog(APP.Configuracion.IdsSetTimeouts); var fechaTiempo = APP.Configuracion.FechaLanzadoTimeout; var tiempoC = APP.Configuracion.TiempoContinuo; @@ -260,24 +264,18 @@ APP = module.exports = { try { if(APP.Configuracion.Modo === 'Recolector_IP'){ - APP.RegistrarLog('0|CORE|Estableciendo Time Zone UTC ' + configGeneralEMA.ConfGeneral.UTC); - APP.RegistrarLog('0|CORE|Verificando Estado de la EMA...'); - APP.RegistrarLog('0|CORE| 🟢 Iniciando el Modo Recolector por IP/WIFI.'); + APP.RegistrarLog('0|CORE|🔧 Estableciendo Time Zone UTC ' + configGeneralEMA.ConfGeneral.UTC); + APP.RegistrarLog('0|CORE|🔧 Verificando Estado de la EMA...'); + APP.RegistrarLog('0|CORE|🟢 Iniciando el Modo Recolector por IP/WIFI.'); APP.Configuracion.TiempoContinuo = configGeneralEMA.ConfGeneral.Tiempo_de_Recoleccion; APP.Configuracion.debug = configGeneralEMA.ConfGeneral.debug; // se levanta el puerto para escuchar las peticiones al puerto indicado. - // const url = require('url'); // para parsear req.url const PORT = APP.Configuracion.Puerto; const HOST = APP.Configuracion.IP; const RUTA = APP.Configuracion.Patch; // e.g., "/datos" const server = http.createServer((req, res) => { - //const parsedUrl = url.parse(req.url, true); - //const pathname = parsedUrl.pathname.toLowerCase(); - //const method = req.method.toUpperCase(); - //const ip = req.socket.remoteAddress.replace('::ffff:', ''); - const base = `http://${HOST}:${PORT}`; let urlRaw = req.url; // Si la ruta empieza con "/xxxx" y no tiene "?" pero sí "&", agregamos "?" @@ -288,9 +286,8 @@ APP = module.exports = { const pathname = myURL.pathname.toLowerCase(); const method = req.method.toUpperCase(); const ip = req.socket.remoteAddress.replace('::ffff:', ''); - - - APP.RegistrarLog('0|CORE| 📥 Recepcion de datos origen ' + ip + ' metodo ' + method + ' ruta ' + pathname); + APP.RegistrarLog('6|REGISTRO|📥 Recepcion IP: ' + ip + ' por ' + method + ' ruta ' + pathname); + //Para detener el servidor if (pathname === '/detener_servidor') { res.writeHead(200, { 'Content-Type': 'text/plain' }); @@ -298,16 +295,19 @@ APP = module.exports = { APP.RegistrarLog('0|CORE| 🔴 Servidor detenido por botón'); server.close(() => { }); + return false; } + //Para recibir la información de la estacion WIFI/IP if (pathname === RUTA) { - if (method === 'GET') { - let Vector = Object.fromEntries(myURL.searchParams.entries()); + + // Comunes para ambos metodos + // se convierte la fecha a la UTC parametrizada var d = new Date(); var utc = d.getTime() + (d.getTimezoneOffset() * 60000); var db = new Date(utc + (3600000 * (APP.Configuracion.utc))); // UTC - Configurado - var dbutc = new Date(utc); // UTC Pura + var dbutc = new Date(utc); // UTC Pura // Se da formato a la fecha y hora var minutos = db.getMinutes(); if (minutos <= 9) { minutos = '0' + minutos; } @@ -346,14 +346,42 @@ APP = module.exports = { horat = null; minutost = null; segundot = null; - dbutc = null; + dbutc = null; + const Etiquetas = [ + 'Fecha local', + 'Fecha ISO', + 'Temperatura exterior (°C)', + 'Temperatura interior (°C)', + 'Humedad exterior (%)', + 'Humedad interior (%)', + 'Luz (kLux)', + 'Radiación UV', + 'Viento (km/h)', + 'Ráfaga (km/h)', + 'Dirección viento (°)', + 'Dirección viento (nombre)', + 'Presión absoluta (hpa)', + 'Presión relativa (hpa)', + 'Lluvia total (mm)', + 'Punto de rocío (°C)', + 'Fecha UTC', + 'Batería Baja (0-No/1-Si)' + ]; + + if (method === 'GET') { + let Vector = Object.fromEntries(myURL.searchParams.entries()); + //APP.RegistrarLog(`5|VECTOR|${JSON.stringify(Vector)}`); let TemperaturaExternaC = ((parseFloat(Vector['tempf']) - 32) * 5 / 9).toFixed(2); let TemperaturaInternaC = ((parseFloat(Vector['indoortempf']) - 32) * 5 / 9).toFixed(2); - let vientoEnKm = (parseFloat(Vector['windspeedmph']) * 1.60934); - let rafagaEnKm = (parseFloat(Vector['windgustmph']) * 1.60934); + let vientoEnKm = (parseFloat(Vector['windspeedmph']) * 1.60934).toFixed(2); + let rafagaEnKm = (parseFloat(Vector['windgustmph']) * 1.60934).toFixed(2); let luxerIntencidad = Vector['solarradiation'] * 683; // luxerIntencidad en Luxer let PresionR = (parseFloat(Vector['baromin']) * 33.8639).toFixed(2); let PresionA = (parseFloat(Vector['absbaromin']) * 33.8639).toFixed(2); + // calculo del punto de rocio + let punto_de_rocio = ((parseFloat(Vector['dewptf']) - 32) * 5 / 9).toFixed(2); + punto_de_rocio = (Math.round(punto_de_rocio * 100)) / 100; + let x = Vector['winddir']; // direccion del viento por nombre switch (true) { @@ -385,7 +413,7 @@ APP = module.exports = { VientoDireccion = 'N/A'; } x = null; - + let lluviaTotalmm = (parseFloat(Vector['totalrainin']) * 25.4).toFixed(2);; // conversion a mm let DatosRecolectados = [ fecha, // *0: Fecha local fechaISO, // *1: Fecha ISO @@ -395,47 +423,25 @@ APP = module.exports = { parseFloat(Vector['indoorhumidity']), // *5: Humedad interior luxerIntencidad, // *6: Luz Intencidad en Klux parseFloat(Vector['UV']), // *7: Radiación UV - vientoEnKm, // *8: Velocidad viento - rafagaEnKm, // *9: Ráfaga + parseFloat(vientoEnKm), // *8: Velocidad viento + parseFloat(rafagaEnKm), // *9: Ráfaga parseFloat(Vector['winddir']), // *10: Dirección viento (grados) VientoDireccion, // *11: Dirección viento (nombre) parseFloat(PresionA), // *12: Presión absoluta hpa parseFloat(PresionR), // *13: Presión relativa hpa - parseFloat(Vector['totalrainin']), // *14: Lluvia acumulada - parseFloat(Vector['dewptf']), // *15: Punto de rocío + parseFloat(lluviaTotalmm), // *14: Lluvia acumulada mm + punto_de_rocio, // *15: Punto de rocío fechaUTC, // *16: UTC desde 'dateutc' Vector['lowbatt'] // *17: Estado batería ]; - const Etiquetas = [ - 'Fecha local', - 'Fecha ISO', - 'Temperatura exterior (°C)', - 'Temperatura interior (°C)', - 'Humedad exterior (%)', - 'Humedad interior (%)', - 'Luz (kLux)', - 'Radiación UV', - 'Viento (km/h)', - 'Ráfaga (km/h)', - 'Dirección viento (°)', - 'Dirección viento (nombre)', - 'Presión absoluta (hpa)', - 'Presión relativa (hpa)', - 'Lluvia total (in)', - 'Punto de rocío (°F)', - 'Fecha UTC', - 'Batería Baja (0-No/1-Si)' - ]; // Se verifican cambios if (DatosRecolectadosAnterior.length < 1) { DatosRecolectadosAnterior = DatosRecolectados;} let cambios = {}; let bandera_cambios = false; - for (let i = 0; i < DatosRecolectados.length; i++) { if ( i === 0 || i === 1 || i === 16) continue; // ignorar índices 0, 1 y 16 que son fechas if (DatosRecolectados[i] !== DatosRecolectadosAnterior[i]) { bandera_cambios = true; - cambios[Etiquetas[i]] = { valorAnterior: DatosRecolectadosAnterior[i], valorNuevo: DatosRecolectados[i] @@ -444,7 +450,7 @@ APP = module.exports = { } //cambios = JSON.stringify(cambios, null, 2); DatosRecolectados.forEach((dato, i) => { - APP.RegistrarLog(`5|REGISTRO|${i} - ${Etiquetas[i]}: ${dato}`); + APP.RegistrarLog(`5|REGISTRO|🗃️ ${i} - ${Etiquetas[i]}: ${dato}`); }); // ACA SE ENVIA AL VALIDADOR Y A LAS REDES CONFIGURADAS var Datos = []; @@ -463,35 +469,141 @@ APP = module.exports = { } else { APP.Configuracion.Repeticiones = 0; APP.Configuracion.Estado_Val_Ant = errorvalidador[0]; - APP.RegistrarLog('0|VALIDADOR|Datos recolectados incorrectos: ' + errorvalidador[1]); + APP.RegistrarLog('0|VALIDADOR|⚠️ Datos recolectados incorrectos: ' + errorvalidador[1]); Datos = null; } }); APP.Configuracion.EstadoSensores = DatosRecolectados[17]; DatosRecolectadosAnterior = DatosRecolectados; // Guardar los datos recolectados para la proxima vez. + TiempoActualRecolector(true); // para reiniciar el tiempo y sincronizar. res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('Datos GET recibidos'); + //TERMINA EL METODO GET } else if (method === 'POST' || method === 'PATCH') { + // COMIENZA EL MOTODO POST let body = ''; req.on('data', chunk => { body += chunk.toString(); }); req.on('end', () => { - const formData = querystring.parse(body); - APP.RegistrarLog('Datos formulario:', formData); + // APP.RegistrarLog('5|REGISTRO|Datos formulario:'+body); + const params = new URLSearchParams(body); + const data = Object.fromEntries(params.entries()); + // Se convierten las unidades necesarias + let TemperaturaExternaC = ((parseFloat(data['tempf']) - 32) * 5 / 9).toFixed(2); + let TemperaturaInternaC = ((parseFloat(data['tempinf']) - 32) * 5 / 9).toFixed(2); + let luxerIntencidad = params.get("solarradiation") * 683; // luxerIntencidad en Luxer + let vientoEnKm = (params.get('windspeedmph') * 1.60934).toFixed(2);; + let rafagaEnKm = (params.get('windgustmph') * 1.60934).toFixed(2);; + let PresionR = (parseFloat(params.get('baromabsin')) * 33.8639).toFixed(2); + let PresionA = (parseFloat(params.get('baromrelin')) * 33.8639).toFixed(2); + // calculo del punto de rocio + var punto_de_rocio = (Math.pow((params.get("humidity") / 100), 0.125)) * (112 - (-(0.9 * TemperaturaExternaC))) - (-(0.1 * TemperaturaExternaC)) - 112; + punto_de_rocio = (Math.round(punto_de_rocio * 100)) / 100; + let x = params.get("winddir"); + // direccion del viento por nombre + switch (true) { + case x === 0: + VientoDireccion = 'Norte'; + break; + case x > 0 && x < 90: + VientoDireccion = 'Nordeste'; + break; + case x === 90: + VientoDireccion = 'Este'; + break; + case x > 90 && x < 180: + VientoDireccion = 'Sudeste'; + break; + case x === 180: + VientoDireccion = 'Sur'; + break; + case x > 180 && x < 270: + VientoDireccion = 'Sudoeste'; + break; + case x === 270: + VientoDireccion = 'Oeste'; + break; + case x > 270 && x < 360: + VientoDireccion = 'Noroeste'; + break; + default: + VientoDireccion = 'N/A'; + } + x = null; + let lluviaTotalmm = (parseFloat(params.get('totalrainin')) * 25.4).toFixed(2); // conversion a mm + let DatosRecolectados = [ + fecha, // *0: Fecha local + fechaISO, // *1: Fecha ISO + parseFloat(TemperaturaExternaC), // *2: Temperatura exterior + parseFloat(TemperaturaInternaC), // *3: Temperatura interior + parseFloat(params.get("humidity")), // *4: Humedad exterior + parseFloat(params.get("humidityin")), // *5: Humedad interior + luxerIntencidad, // *6: Luz Intencidad en Klux + parseFloat(params.get("uv")), // *7: Radiación UV + parseFloat(vientoEnKm), // *8: Velocidad viento + parseFloat(rafagaEnKm), // *9: Ráfaga + parseFloat(params.get("winddir")), // *10: Dirección viento (grados) + VientoDireccion, // *11: Dirección viento (nombre) + parseFloat(PresionA), // *12: Presión absoluta hpa + parseFloat(PresionR), // *13: Presión relativa hpa + parseFloat(lluviaTotalmm), // *14: Lluvia acumulada + punto_de_rocio, // *15: Punto de rocío + fechaUTC, // *16: UTC desde 'dateutc' + params.get('wh65batt') // *17: Estado batería + ]; + // Se verifican cambios + if (DatosRecolectadosAnterior.length < 1) { DatosRecolectadosAnterior = DatosRecolectados;} + let cambios = {}; + let bandera_cambios = false; + for (let i = 0; i < DatosRecolectados.length; i++) { + if ( i === 0 || i === 1 || i === 16) continue; // ignorar índices 0, 1 y 16 que son fechas + if (DatosRecolectados[i] !== DatosRecolectadosAnterior[i]) { + bandera_cambios = true; + cambios[Etiquetas[i]] = { + valorAnterior: DatosRecolectadosAnterior[i], + valorNuevo: DatosRecolectados[i] + }; + } + } + //cambios = JSON.stringify(cambios, null, 2); + DatosRecolectados.forEach((dato, i) => { + APP.RegistrarLog(`5|REGISTRO|🗃️ ${i} - ${Etiquetas[i]}: ${dato}`); + }); + // ACA SE ENVIA AL VALIDADOR Y A LAS REDES CONFIGURADAS + var Datos = []; + Datos = ['validar', DatosRecolectados,cambios,bandera_cambios]; + Validador.Registros(Datos, function (errorvalidador, estadovalidador) + { + if (estadovalidador === true) { + APP.Configuracion.Repeticiones += 1; + APP.Configuracion.RepeticionesConError = 0; + APP.Configuracion.TiempoMaximo = 0; + APP.Configuracion.TiempoFueraDeLinea = 0; + APP.Configuracion.FechaLanzadoTimeout = Date.now(); + APP.Registro_Diario(Datos[1],cambios,bandera_cambios); + APP.Publicar_en_Redes(); + Datos = null; + } else { + APP.Configuracion.Repeticiones = 0; + APP.Configuracion.Estado_Val_Ant = errorvalidador[0]; + APP.RegistrarLog('0|VALIDADOR|⚠️ Datos recolectados incorrectos: ' + errorvalidador[1]); + Datos = null; + } }); + APP.Configuracion.EstadoSensores = DatosRecolectados[17]; + DatosRecolectadosAnterior = DatosRecolectados; // Guardar los datos recolectados para la proxima vez. + APP.TiempoActualRecolector(true); // para reiniciar el tiempo y sincronizar. res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('Datos POST/PATCH recibidos'); }); } else { - res.writeHead(405, { 'Content-Type': 'text/plain' }); - res.end('Método no permitido'); + APP.RegistrarLog('0|RECOLETOR_IP|⚠️ Dato Recibido pero metodo no encontrada: ' + method); } } else { - res.writeHead(404, { 'Content-Type': 'text/plain' }); - res.end('Ruta no encontrada'); + APP.RegistrarLog('0|RECOLETOR_IP|⚠️ Dato Recibido pero ruta no encontrada: ' + pathname); } }); server.listen(PORT, HOST, () => { - APP.RegistrarLog(`0|CORE| 🟢 Servidor escuchando en ${HOST}:${PORT}`); + APP.RegistrarLog(`0|CORE|🟢 Servidor escuchando en ${HOST}:${PORT}`); APP.Configuracion.Errores = `🟢 Servidor escuchando en ${HOST}:${PORT}`; APP.Configuracion.TiempoMaximo = 0; APP.Configuracion.Run = 1; @@ -511,7 +623,8 @@ APP = module.exports = { } }); - }else{ + }else{ // RECOLECTOR USB + APP.RegistrarLog('0|CORE|Estableciendo Time Zone UTC ' + configGeneralEMA.ConfGeneral.UTC); APP.RegistrarLog('0|CORE|Verificando Estado de la EMA...'); APP.Configuracion.TiempoContinuo = configGeneralEMA.ConfGeneral.Tiempo_de_Recoleccion; @@ -585,8 +698,8 @@ APP = module.exports = { } APP.RegistrarLog('1|MAIL|Se envio correo notificando que la estacion ' + configGeneralEMA.ConfGeneral.NombreEstacion + ' se encuentra fuera de linea por mas de: ' + (APP.Configuracion.TiempoFueraDeLinea / 1000) + 's o ' + (APP.Configuracion.TiempoFueraDeLinea / 1000 / 60).toFixed(2) + ' minutos'); } - APP.RegistrarLog('1|ERROR| 🔴 ' + err + '.'); - APP.RegistrarLog('1|ERROR| 🔴 Se espera ' + (tiempo / 1000) + ' segundos ( Tiempo fuera de linea: ' + (APP.Configuracion.TiempoFueraDeLinea / 1000) + 's o ' + (APP.Configuracion.TiempoFueraDeLinea / 1000 / 60).toFixed(2) + ' minutos), luego se intenta iniciar el recolector.'); + APP.RegistrarLog('1|ERROR|🔴 ' + err + '.'); + APP.RegistrarLog('1|ERROR|🔴 Se espera ' + (tiempo / 1000) + ' segundos ( Tiempo fuera de linea: ' + (APP.Configuracion.TiempoFueraDeLinea / 1000) + 's o ' + (APP.Configuracion.TiempoFueraDeLinea / 1000 / 60).toFixed(2) + ' minutos), luego se intenta iniciar el recolector.'); APP.Configuracion.IdsSetTimeouts.push(setTimeout(APP.Conectar, tiempo)); tiempo = null; }); @@ -597,7 +710,7 @@ APP = module.exports = { if (APP.Configuracion.BanderaPendientes === 0) { // Pregunto si no esta destanqueando APP.Configuracion.TanquePendiente = []; APP.Configuracion.BanderaPendientes = 1; - APP.RegistrarLog('3|PENDIENTE|Verificando el Tanque de Pendientes.'); + APP.RegistrarLog('3|PENDIENTE|🛢️ Verificando el tanque.'); try { fs.readFile('./logs/TanquePendientes.log', { encoding: 'utf8', @@ -605,13 +718,13 @@ APP = module.exports = { }, function (err, data) { try { if (err) { - APP.RegistrarLog('1|ERROR: Intentando destanquear los registros prendientes:'); + APP.RegistrarLog('1|ERROR|🛢️🔴 Intentando destanquear los registros.'); APP.Configuracion.BanderaPendientes = 0; } if (data.length < 10) { APP.Configuracion.CantidadPendientes = 0; APP.Configuracion.BanderaPendientes = 0; - APP.RegistrarLog('3|PENDIENTE|Tanque PENDIENTES vacio.'); + APP.RegistrarLog('3|PENDIENTE|🛢️ Tanque vacio.'); } else { Guardar = []; var EnviarPendientes = []; @@ -619,7 +732,7 @@ APP = module.exports = { var CantRegistros = Pendientes.length; var intentos = 0; APP.Configuracion.CantidadPendientes = CantRegistros; - APP.RegistrarLog('3|PENDIENTE|Cantidad Registros en Pendientes: ' + CantRegistros); + APP.RegistrarLog('3|PENDIENTE|🛢️ Cantidad Registros en Pendientes: ' + CantRegistros); for (var i = 0, t = CantRegistros; i < t; ++i) { EnviarPendientes[0] = [Pendientes[i].TipoRed, Pendientes[i].Usuario, Pendientes[i].Password, Pendientes[i].Server, Pendientes[i].Puerto, Pendientes[i].Ruta, Pendientes[i].Llave_W, Pendientes[i].Nombre, 'PENDIENTE']; EnviarPendientes[1] = Pendientes[i].registro; @@ -629,7 +742,7 @@ APP = module.exports = { Redes.EviarRedesMeteorologicas(versionEMA, EnviarPendientes, function (red, estadored, errorRedes, idRed, registro) { var RegistroEnviado = JSON.parse(registro); if (estadored === 'ERROR') { // si falla el destanqueo - APP.RegistrarLog('3|PENDIENTE|Error no se pudo publicar la Red : ' + red + ' - Estado:' + estadored); + APP.RegistrarLog('3|PENDIENTE|🛢️🔴 Error no se pudo publicar la Red : ' + red + ' - Estado:' + estadored); var Pendiente = { idRed: RegistroEnviado[2], TipoRed: RegistroEnviado[0][0], @@ -649,7 +762,7 @@ APP = module.exports = { if (APP.Configuracion.CantidadPendientes < 0) { APP.Configuracion.CantidadPendientes = 0; } - APP.RegistrarLog('0|PENDIENTE_PUB|Fecha Registro:' + RegistroEnviado[1].fecha + ' - Red Publicada: ' + red + ' - Estado:' + estadored); + APP.RegistrarLog('0|RED|🌐🛢️ Red Publicada Tanque:' + red + '- Fecha Registro:' + RegistroEnviado[1].fecha + ' - Estado:' + estadored); } }); // CALLBACK ENVIAR RED } else { @@ -661,7 +774,7 @@ APP = module.exports = { EnviarPendientes = null; } } catch (ex) { // si hay un error en el archivo tanque de pendiente se blanquea y se vuelve a llamar la misma. - APP.RegistrarLog('1|ERROR| 🔴 Tanque Pendientes corrupto.Se blanqueo el tanque diario para depurar el error. 2: ' + ex); + APP.RegistrarLog('1|ERROR|🔴 Tanque Pendientes corrupto.Se blanqueo el tanque diario para depurar el error. 2: ' + ex); APP.Configuracion.TanquePendiente = []; APP.Configuracion.BanderaPendientes = 0; fs.writeFile('./logs/TanquePendientes.log', JSON.stringify(APP.Configuracion.TanquePendiente, null, 4), { @@ -675,14 +788,14 @@ APP = module.exports = { } }); } catch (ex) { // si hay un error en el archivo tanque de pendiente se blanquea y se vuelve a llamar la misma. - APP.RegistrarLog('1|ERROR| 🔴 Tanque Pendientes corrupto.Se blanqueo el tanque diario para depurar el error. 1: ' +ex); + APP.RegistrarLog('1|ERROR|🔴 Tanque Pendientes corrupto.Se blanqueo el tanque diario para depurar el error. 1: ' +ex); APP.Configuracion.TanquePendiente = []; fs.writeFile('./logs/TanquePendientes.log', JSON.stringify([], null, 4), { encoding: 'utf8', autoClose: true }, function (err) { if (err) { - APP.RegistrarLog('1|ERROR| 🔴 Guardando registro de prendientes de Ema Center en archivo :' + err); + APP.RegistrarLog('1|ERROR|🔴 Guardando registro de prendientes de Ema Center en archivo :' + err); } }); } @@ -704,7 +817,7 @@ APP = module.exports = { autoClose: true }, function (err) { if (err) { - APP.RegistrarLog('1|ERROR: Guardando registro de prendientes de Ema Center en archivo :' + err); + APP.RegistrarLog('1|ERROR|🔴 Guardando registro de prendientes de Ema Center en archivo :' + err); } }); } else { @@ -713,7 +826,7 @@ APP = module.exports = { autoClose: true }, function (err) { if (err) { - APP.RegistrarLog('1|ERROR: Guardando registro de prendientes de Ema Center en archivo :' + err); + APP.RegistrarLog('1|ERROR|🔴 Guardando registro de prendientes de Ema Center en archivo :' + err); } }); } @@ -756,9 +869,9 @@ APP = module.exports = { "error": errorRedes }; APP.Configuracion.UltimoPublicado[idRed] = RegistroPublicado; - APP.RegistrarLog('3|RED|Red No Publicada: ' + red + ' - Estado:' + estadored + ' ' + errorRedes); + APP.RegistrarLog('3|RED|🌐🔴 Red No Publicada: ' + red + ' - Estado:' + estadored + ' ' + errorRedes); if ((red === 'emacenter') || (red === 'emacentergugler')) { - APP.RegistrarLog('0|PENDIENTE_ALM|Se almaceno en el tanque de pendientes red EmaCenter: ' + RegistroEnviado[0][7]); + APP.RegistrarLog('0|PENDIENTE|🛢️ Se almaceno registro en el tanque de pendientes: ' + RegistroEnviado[0][7]); RegistroEnviado[1].tanque = true; var PendienteTemp = { idRed: RegistroEnviado[2], @@ -807,7 +920,7 @@ APP = module.exports = { } } APP.Configuracion.UltimoPublicado[idRed] = RegistroPublicado; - APP.RegistrarLog('3|RED|Red Publicada: ' + red + ' - Estado:' + estadored); + APP.RegistrarLog('3|RED|🌐 Red Publicada: ' + red + ' - Estado:' + estadored); } }); // CALLBACK ENVIAR RED } else { @@ -923,12 +1036,12 @@ APP = module.exports = { } else { var DepurarLog = false; if (data.length < 10) { - APP.RegistrarLog('3|ARCHIVO|Tanque diario vacio.'); + APP.RegistrarLog('8|ARCHIVO|🗄️ Tanque diario vacio.'); } else { try { var RegistroDiario = JSON.parse(data); var CantRegistros = RegistroDiario.length; - APP.RegistrarLog('8|ARCHIVO|Cantidad registros diarios: ' + CantRegistros); + APP.RegistrarLog('8|ARCHIVO|🗄️ Cantidad registros diarios: ' + CantRegistros); var RegistroNuevoDia = Datos[0].substring(0, 2); var RegistroNuevoHora = Datos[0].substring(11, 13); var RegistroNuevoMinuto = Datos[0].substring(14, 15); @@ -1052,9 +1165,9 @@ APP = module.exports = { if (LLuviaAcumuladaMinutos > 0) { LluviaActual = LLuviaAcumuladaMinutos; } else { LLuviaAcumuladaMinutos = 0; LluviaActual = 0; } if (LLuviaAcumuladaHora < 0) { LLuviaAcumuladaHora = 0; } if (LLuviaAcumuladaDia < 0) { LLuviaAcumuladaDia = 0; } - APP.RegistrarLog('5|REGISTRO|Calculado - Lluvia Hora: ' + LLuviaAcumuladaHora.toFixed(2)); - APP.RegistrarLog('5|REGISTRO|Calculado - Lluvia Actual: ' + LLuviaAcumuladaMinutos.toFixed(2)); - APP.RegistrarLog('5|REGISTRO|Calculado - Lluvia Dia: ' + LLuviaAcumuladaDia.toFixed(2)); + APP.RegistrarLog('5|REGISTRO|🌧️ Calculado - Lluvia Hora: ' + LLuviaAcumuladaHora.toFixed(2)); + APP.RegistrarLog('5|REGISTRO|🌧️ Calculado - Lluvia Actual: ' + LLuviaAcumuladaMinutos.toFixed(2)); + APP.RegistrarLog('5|REGISTRO|🌧️ Calculado - Lluvia Dia: ' + LLuviaAcumuladaDia.toFixed(2)); var RegistroJSON = { fecha: Datos[0], fechaISO: Datos[1], @@ -1170,18 +1283,18 @@ APP = module.exports = { d = null; if (recolector.status() === true) { if (APP.Configuracion.Repeticiones > 1) APP.RegistrarLog('8|LECTURA|Inicio Lectura'); - APP.RegistrarLog('8|REGISTRO|Estado: online (' + APP.Configuracion.RepeticionesConError + ')'); - APP.RegistrarLog('8|REGISTRO|Fecha: ' + fechac); - APP.RegistrarLog('8|REGISTRO|Tiempo Recolección: ' + APP.Configuracion.TiempoContinuo); - APP.RegistrarLog('8|REGISTRO|Cant. Lect. sin corte: ' + APP.Configuracion.Repeticiones); + APP.RegistrarLog('8|REGISTRO|🎛️ Estado: online (' + APP.Configuracion.RepeticionesConError + ')'); + APP.RegistrarLog('8|REGISTRO|🎛️ Fecha: ' + fechac); + APP.RegistrarLog('8|REGISTRO|🎛️ Tiempo Recolección: ' + APP.Configuracion.TiempoContinuo); + APP.RegistrarLog('8|REGISTRO|🎛️ Cant. Lect. sin corte: ' + APP.Configuracion.Repeticiones); //Se busca un registro usb (PROMESA - resultado(registro,cambios, true o false(si hay cambios)) recolector.Recolectar().then((resultado)=> { //APP.RegistrarLog(resultado[1]); var datosRecolectados = resultado[0]; if ((APP.Configuracion.RepeticionesConError) > APP.Configuracion.Cantidad_No_Lectura) { - APP.RegistrarLog('0|CORE|IMPORTANTE: No se puede leer la EMA por USB. Supero la Cantidad Máxima de No Lectura definida.'); - APP.RegistrarLog('0|CORE|IMPORTANTE: Supero la Cantidad Máxima de No Lectura definida.'); + APP.RegistrarLog('0|CORE|⚠️ IMPORTANTE: No se puede leer la EMA por USB. Supero la Cantidad Máxima de No Lectura definida.'); + APP.RegistrarLog('0|CORE|⚠️ IMPORTANTE: Supero la Cantidad Máxima de No Lectura definida.'); throw new Error('NolecturaUSB'); } if (typeof datosRecolectados !== 'undefined') @@ -1206,7 +1319,7 @@ APP = module.exports = { } else { APP.Configuracion.Repeticiones = 0; APP.Configuracion.Estado_Val_Ant = errorvalidador[0]; - APP.RegistrarLog('0|VALIDADOR|Datos recolectados incorrectos: ' + errorvalidador[1]); + APP.RegistrarLog('0|VALIDADOR|⚠️ Datos recolectados incorrectos: ' + errorvalidador[1]); APP.Configuracion.FechaLanzadoTimeout = Date.now(); APP.Configuracion.IdsSetTimeouts.push(setTimeout(APP.Continuo, APP.Configuracion.TiempoContinuo * 1000)); Datos = null; @@ -1214,7 +1327,7 @@ APP = module.exports = { }); Datos = null; } else { - APP.RegistrarLog('0|CORE|Sincronizando.'); + APP.RegistrarLog('0|CORE|⏳ Sincronizando.'); APP.Configuracion.Repeticiones = 0; APP.Configuracion.RepeticionesConError = 0; APP.Configuracion.IdsSetTimeouts.push(setTimeout(APP.Continuo, 1000)); @@ -1226,15 +1339,15 @@ APP = module.exports = { APP.Configuracion.IdsSetTimeouts.push(setTimeout(APP.Continuo, 5000)); } } else { - APP.RegistrarLog('0|CORE|Recolector detenido.'); + APP.RegistrarLog('0|CORE|⏹️ Recolector detenido.'); APP.Configuracion.RunTime = 0; } } catch (ex) { - APP.RegistrarLog('0|EXCEP|Información de la excepción: -> ' + ex + ''); + APP.RegistrarLog('0|EXCEP|💥 Información de la excepción: -> ' + ex + ''); APP.Configuracion.Errores = 'EXCEP: Información de la excepción: -> ' + ex; var tiempo = (APP.Configuracion.TiempoMaximo + APP.Configuracion.TiempoContinuo) * 1000; APP.Configuracion.TiempoFueraDeLinea += tiempo; - APP.RegistrarLog('0|EXCEP|Se espera ' + (tiempo / 1000) + ' segundos y se prueba conectar nuevamente ....'); + APP.RegistrarLog('0|EXCEP|💥 Se espera ' + (tiempo / 1000) + ' segundos y se prueba conectar nuevamente ....'); APP.Configuracion.IdsSetTimeouts.push(setTimeout(APP.Conectar, tiempo)); tiempo = null; } @@ -1246,9 +1359,9 @@ APP = module.exports = { var parametros = process.argv; // Se lee el parametro if (parametros.indexOf('console') === -1) { // No se realiza nada ya que se tiene que iniciar desde el aplicativo - APP.RegistrarLog('0|CORE|Se inició el aplicativo EmaLibre gráfico o Web.'); + APP.RegistrarLog('0|CORE|⏳ Iniciando Ema Libre en Modo gráfico o Web.'); } else { APP.Conectar(); - APP.RegistrarLog('0|CORE|Iniciando Ema Libre en Modo Consola!!!.'); + APP.RegistrarLog('0|CORE|⏳ Iniciando Ema Libre en Modo Consola!!!.'); } diff --git a/src/core/recolector.js b/src/core/recolector.js index 3966f88..88a3b0e 100644 --- a/src/core/recolector.js +++ b/src/core/recolector.js @@ -82,11 +82,11 @@ function RegistrarLog (reg, depurar) { try { - RegistrarLog('0|CORE|Buscando Modulo USB para el S.O - ' + PlataformaFinal); + RegistrarLog('0|CORE|🕵️. Buscando Modulo USB para el S.O - ' + PlataformaFinal); var HID = require('node-hid'); - RegistrarLog("0|CORE|Modulo node-hid cargado correctamente."); + RegistrarLog("0|CORE|✅ Modulo node-hid cargado correctamente."); } catch (e) { - RegistrarLog('0|ERROR|No se pudo levantar el modulo node hid para su plataforma. ' + PlataformaFinal); + RegistrarLog('0|ERROR|⚠️ No se pudo levantar el modulo node hid para su plataforma. ' + PlataformaFinal); } // CODIGO DEL RECOLECTOR DE DATOS diff --git a/src/core/redes/windy.js b/src/core/redes/windy.js index 45b36a8..d193c19 100644 --- a/src/core/redes/windy.js +++ b/src/core/redes/windy.js @@ -73,7 +73,7 @@ var FechaUltimoPublicadoWindy = "S/D"; if (!(this instanceof WINDY)) return new WINDY(ID, PASSWORD); var payload = { - station: PASSWORD || '' + station: PASSWORD || 0 }; this.setObservations = function () { @@ -191,33 +191,49 @@ var FechaUltimoPublicadoWindy = "S/D"; }); server.path = server.fijo; server.path += '?' + queryString.join('&'); + //APP.RegistrarLog('5|WINDY| GET:'+server.path); var request = http.request(server, function (response) { var message = ''; response.on('data', function (chunk) { message += chunk; }); - response.on('end', function () { - var result = message.trim(); - if (result === 'SUCCESS') { - // Registro publicado correctamente - FechaUltimoPublicadoWindy = fecha; - that.resetObservations(); - callback(null, result); - } else { - - if (result.substr(result, 8) == 'SUCCESS ' ) - { // Esta Congestionada - that.resetObservations(); - callback(null, [429, FechaUltimoPublicadoWindy]); - } else { - // Otro error. - var detalle_error = result.substr(result, 100); - callback(new Error(detalle_error), null); - } - } - }); - }); + response.on('end', function () { + var result = message.trim(); // cuerpo de respuesta (texto) + var status = response.statusCode; // código HTTP real + //APP.RegistrarLog(`5|WINDY| RESPUESTA [${status}]: ${result}`); + // ✅ Caso 200: todo OK + if (status === 200) { + FechaUltimoPublicadoWindy = fecha; + that.resetObservations(); + callback(null, result); + return; + } + // ⚠️ Caso 400: congestión (Windy busy) + if (status === 400) { + // Verificamos si la respuesta incluye "error" o algo similar + let detalle = ""; + try { + const parsed = JSON.parse(result); + detalle = parsed.error || parsed.message || result; + } catch (e) { + detalle = result; + } + // APP.RegistrarLog(`5|WINDY| CONGESTION: ${detalle}`); + that.resetObservations(); + callback(null, [429, FechaUltimoPublicadoWindy]); + return; + } + // ❌ Otros errores + var detalle_error = result.substring(0, 200); + //APP.RegistrarLog(`5|WINDY| ERROR (${status}): ${detalle_error}`); + callback(new Error(detalle_error), null); + }); + + + + + }); request.on('socket', function (socket) { socket.setTimeout(timeout); diff --git a/src/gui/controlador/funcionesgenerales.js b/src/gui/controlador/funcionesgenerales.js index 52bd785..2414a3e 100644 --- a/src/gui/controlador/funcionesgenerales.js +++ b/src/gui/controlador/funcionesgenerales.js @@ -106,11 +106,8 @@ async function EstadoMenuInicio() $('#inombre').html(configGeneralEMA.ConfGeneral.NombreEstacion); $('#botoniniciar').attr("disabled",true); $('#botondetener').attr("disabled",true) - if(configGeneralEMA.ConfGeneral.NombreEstacion != ''){$("#img_nombre").attr("src",icono_control_true);}else{$("#img_nombre").attr("src",icono_control_neutro);} $('#iso').html(plataforma + " (" + arquitectura + ")"); - if(plataforma != ''){$("#img_so").attr("src",icono_control_true);}else{$("#img_so").attr("src",icono_control_false);} $('#imodo').html(configGeneralEMA.ConfGeneral.Modo); - if(configGeneralEMA.ConfGeneral.Modo != ''){$("#img_modo").attr("src",icono_control_true);}else{$("#img_modo").attr("src",icono_control_false);} if(configGeneralEMA.ConfGeneral.Modo != 'Visor') // Se consulta el modo (Recolector o Visor) { if(configGeneralEMA.ConfGeneral.Modo === 'Recolector_USB') // Modo Recolector USB @@ -348,7 +345,8 @@ async function ClimaActual() { // Se obtiene el estado actual del clima var SALIDA_ENTRADA = "";var LLUEVE = 0; var NOCHE_DIA = 1; - if( UltimoReg.lloviendo > 0){LLUEVE = '1'; }else{LLUEVE = '0';} // LLUEVE? + //if( UltimoReg.lloviendo > 0){LLUEVE = '1'; }else{LLUEVE = '0';} // LLUEVE? + LLUEVE = (UltimoReg?.lloviendo ?? 0) > 0 ? '1' : '0'; if( UltimoReg.luxer_intencidad > 0){ NOCHE_DIA = '1'; }else{NOCHE_DIA = '0';} // DIA o NOCHE? if( (UltimoReg.luxer_intencidad > UltimoReg.luxer_intencidad_1hs) && (UltimoReg.luxer_intencidad > 0 && UltimoReg.luxer_intencidad < 800)){ SALIDA_ENTRADA = '_1.gif';} // ALBA? if( (UltimoReg.luxer_intencidad < UltimoReg.luxer_intencidad_1hs) && (UltimoReg.luxer_intencidad > 0 && UltimoReg.luxer_intencidad < 800)){ SALIDA_ENTRADA = '_0.gif';} // OCASO? @@ -602,12 +600,12 @@ function ListarRedes() { TablaHTML += ""+Publicar[i].Nombre+""+Publicar[i].TipoRed+"SINON/A"+publicar+""; + TablaHTML += ""; }else{ if(Publicar[i].Llave_W != ''){var tienellave = "SI";}else{var tienellave ="NO";} TablaHTML += ""+Publicar[i].Nombre+""+Publicar[i].TipoRed+"N/A"+tienellave+""+(Publicar[i].Puerto || "N/A")+""+publicar+""; + TablaHTML += ""; } } TablaHTML += ""; @@ -657,28 +655,32 @@ function MenuRedes(red) switch ($('#Red_activa_'+red).val()) { case 'Eliminar': // SE PREGUNTA SI ESTA SEGURO + HABLA(0,'¿Esta seguro de eliminar
la red '+ configGeneralEMA.ConfPublicador[red].Nombre +'?',"success"); $(document).off('click', '.notifyjs-foo-base .no'); // Se elimina el evento si existe $(document).off('click', '.notifyjs-foo-base .yes'); // Se elimina el evento si existe - HABLA(0,'¿Esta seguro de eliminar
la red '+ configGeneralEMA.ConfPublicador[red].Nombre +'?',"success"); - $.notify.addStyle('foo', { - html: - "
" + - "
" + - "
" + - "" + + $.notify.addStyle('foo', { + html: + "
" + + "
" + + "
" + + "
" + + " " + + "" + "
" + - "
" + "
" + + "
" }); - //PREGUNTA + + // --- Mostrar notificación --- $("#carpincho_img").notify({ - title: '¿Esta seguro de eliminar la red '+ configGeneralEMA.ConfPublicador[red].Nombre +'?', - button: 'SI' + title: '¿Está seguro de eliminar la red ' + configGeneralEMA.ConfPublicador[red].Nombre + '?' }, { - position:"right middle", - style: 'foo', - autoHide: false, - clickToHide: false + position: "right middle", + style: 'foo', + autoHide: false, + clickToHide: false }); + $(document).on('click', '.notifyjs-foo-base .no', function() { //RESPONDE NO ListarRedes(); @@ -706,6 +708,51 @@ function MenuRedes(red) break; case 'Modificar': FormModificar(red); break; + + case 'SitioOficial': + let tipored = configGeneralEMA.ConfPublicador[red].TipoRed; + tipored = tipored.toLowerCase(); + let url = ''; + switch (tipored) { + case 'openweathermap': + url = 'https://openweathermap.org/'; + break; + case 'wow': + url = 'https://wow.metoffice.gov.uk/'; + break; + case 'windguru': + url = 'https://www.windguru.cz/'; + break; + case 'windy': + url = 'https://www.windy.com/'; + break; + case 'awekas': + url = 'https://www.awekas.at/'; + break; + case 'wunderground': + url = 'https://www.wunderground.com/'; + break; + case 'pws': + url = 'https://www.pwsweather.com/'; + break; + case 'emacenter': + url = 'https://emacenter.gugler.com.ar/'; + break; + case 'emacentergugler': + url = 'https://emacenter.gugler.com.ar/'; + break; + + default: + HABLA(0, "No se encontró el sitio oficial para la red '" + tipored + "'", "warn"); + return; + } + if (url !== '') { + const openExternal = require('nw.gui').Shell.openExternal; + openExternal(url); + HABLA(0, "Abriendo sitio oficial de '" + tipored + "'.", "info"); + } + ListarRedes(); + break; } } @@ -1299,21 +1346,21 @@ async function MostrarTabla(DATOS,DIV,TABLA) async function graficoEstadisticas() { + // GRAFICO DEL TIEMPO CHARTJS + document.getElementById("grafico").style.display = "none"; + document.getElementById("actualizando").style.display = "block"; - // GRAFICO DEL TIEMPO CHARTJS - document.getElementById("grafico").style.display = "none"; - document.getElementById("actualizando").style.display = "block"; - //Se genera el grafico - if(['Recolector_USB', 'Recolector_IP'].includes(configGeneralEMA.ConfGeneral.Modo)) // se comprueba el modo se encuentra en Recolector - { + //Se genera el grafico normal + if(['Recolector_USB', 'Recolector_IP'].includes(configGeneralEMA.ConfGeneral.Modo)) // se comprueba el modo se encuentra en Recolector + { - fsconf.readFile('./logs/registro_diario.log', { - encoding: 'utf8', - autoClose: true - }, (err, data) => { - if (err) { - EMA.RegistrarLog("1|ERROR|Error al intentar leer el registro diario para generar el grafico estadistico."); - } else { + fsconf.readFile('./logs/registro_diario.log', { + encoding: 'utf8', + autoClose: true + }, (err, data) => { + if (err) { + EMA.RegistrarLog("1|ERROR|Error al intentar leer el registro diario para generar el grafico estadistico."); +} else { var db = new Date(); var mes = db.getMonth() + 1; if(mes <= 9) {mes = '0'+ mes}; var dia= db.getDate();if(dia <= 9) {dia = '0'+ dia}; @@ -1329,8 +1376,8 @@ async function graficoEstadisticas() var RegistroDiarioTmp = JSON.parse(data); var CantRegistros = RegistroDiarioTmp.length; // console.log(CantRegistros); - if(CantRegistros > 1) - { + if(CantRegistros > 1) + { delete RegistroDiarioTmp['fechaISO']; delete RegistroDiarioTmp['fechaUTC']; delete RegistroDiarioTmp['luxer_intencidad_1hs']; @@ -1376,266 +1423,60 @@ async function graficoEstadisticas() var presionRel = RegistroDiarioConCambios.map(function(e) { return e.presion_relativa || 0;}); var validacion = RegistroDiarioConCambios.map(function(e) { return (e.estado_validacion_ant) || 0;}); var puntorocio = RegistroDiarioConCambios.map(function(e) { return e.punto_de_rocio || 0;}); - - - //console.log(validacion); - var totalErrores = 0; - for(var i=0;i + - < - - + + -
+
-
+

EMA Libre Cliente
(Carpincho)
Licencia GPLv3

@@ -121,9 +122,9 @@ - @@ -139,7 +140,7 @@
-
+
@@ -157,7 +158,23 @@ $(document).ready(function() { $('.menu').on('click', function(evnt) { var obj = $(evnt.target); - $('#' + obj.attr('aria-controls')).empty(); + $('#' + obj.attr('aria-controls')).empty(); + let screens = gui.Screen.screens; + let winX = win.x; + let winY = win.y; + let currentScreen = screens[0]; + for (let screen of screens) { + if ( + winX >= screen.bounds.x && + winX < screen.bounds.x + screen.bounds.width && + winY >= screen.bounds.y && + winY < screen.bounds.y + screen.bounds.height + ) { + currentScreen = screen; + break; + } + } + //nw.Window.get().moveTo(0); switch (obj.attr('id')) { case 'Wzoomin': win.zoomLevel += 0.3; @@ -166,16 +183,21 @@ win.zoomLevel -= 0.3; break; case 'Wfull': - win.toggleFullscreen(); + nw.Window.get().moveTo(currentScreen.bounds.x, currentScreen.bounds.y); + nw.Window.get().resizeTo(currentScreen.bounds.width, currentScreen.bounds.height); break; - case 'Wmin': - win.minimize(); + case 'Wmin': + nw.Window.get().minimize(); + //win.hide(); // Oculta completamente la ventana + //win.setShowInTaskbar(false); // Quita el icono del taskbar break; case 'Wmax': - win.maximize(); + nw.Window.get().moveTo(currentScreen.bounds.x, currentScreen.bounds.y); + nw.Window.get().resizeTo(currentScreen.bounds.width, currentScreen.bounds.height); break; case 'Wmaxun': - win.unmaximize() + nw.Window.get().moveTo(currentScreen.bounds.x, currentScreen.bounds.y); + nw.Window.get().resizeTo(currentScreen.bounds.width/2, currentScreen.bounds.height/2); break; case 'Wclo': EMA.Salir(); diff --git a/src/gui/view/modelo_contacto.html b/src/gui/view/modelo_contacto.html index 5ddff81..133f89f 100644 --- a/src/gui/view/modelo_contacto.html +++ b/src/gui/view/modelo_contacto.html @@ -26,7 +26,7 @@

Check Software: EMA Libre Cliente (Carpincho)

Check Versión: -

-

Check Sitio Oficial: ema.gugler.com.ar

+

Check Sitio Oficial: https://ema.gugler.com.ar

Check Licencia: GPLv3

@@ -53,9 +53,8 @@ Si deseas realizar consultas, sugerencias o tienes alguna duda sobre nuestros productos/servicios, puedes comunicarte con nosotros a través de los siguientes medios:

Check Teléfono: (0054 - 0343) 4975044 - Interno 119

-

Check Correo Electrónico: gugler_contacto@uader.edu.ar

-

Check Sitio Oficial: gugler.com.ar

+

Check Correo Electrónico: gugler_contacto@uader.edu.ar

+

Check Sitio Oficial: https://www.gugler.com.ar

-
- \ No newline at end of file +
\ No newline at end of file diff --git a/src/gui/view/modelo_estadisticas.html b/src/gui/view/modelo_estadisticas.html index 8915cfa..6dbbb27 100644 --- a/src/gui/view/modelo_estadisticas.html +++ b/src/gui/view/modelo_estadisticas.html @@ -7,19 +7,18 @@


Cargando Gráfico...
- +
-