Autor Tema: Envío de datos con Windows 10 y Windows 11  (Leído 2184 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado jantoni

  • Administrator
  • Hero Member
  • ******
  • Mensajes: 5.728
    • meteorivas.es
  • Estación: ESMAD2800000028522A
Envío de datos con Windows 10 y Windows 11
« en: 07 de Mayo de 2025, 12:51:34 »
Para aquellos que tengáis problemas con Visual Star, os dejo un script en format .bat para que podáis enviar los datos a Meteoclimatic.

El script no es mío, pero es muy sencillo...

Solo hay que modificar el fichero poniendo el api key y la ruta donde se encuentra el fichero con los datos creado por Weatherlink, Cumulus o el programa que sea.

Y luego ejecutarlo. Teóricamente se ejecutará cada 5 minutos hasta que el usuario lo pare.

Solo Windows 10 y Windows 11. Para versiones anteriores hay que hacer apaños y no se dará soporte para versiones anteriores de Windows(tendréis que apañaros con Google y las IA para instalar CURL que es el único requisito de este script)

Podéis descargaros el archivo meteoclimatic.bat o copiarlo desde el código que se adjunta:

Código: [Seleccionar]
@echo off

rem El script está preparado para buscar el fichero meteoclimatic.htm en el directorio donde se encuentre ubicado el Script.


rem #########################################################
REM ## SOLO TIENES QUE CONFIGURAR LA APIKEY DE TU ESTACIÓN ##
REM ## ESCRÍBELA SIN COMILLAS A PARTIR DEL SIGNO IGUAL ##  ##
REM #########################################################



set apikey=




rem #########################################################
rem ########   NO MODIFICAR NADA A PARTIR DE AQUI   #########
rem #########################################################

setlocal

:loop

rem Obtiene la ruta del directorio actual del script
for %%I in (%0) do set "script_dir=%%~dpI"

rem Define la ruta del archivo meteoclimatic.htm
set "datafile=%script_dir%meteoclimatic.htm"

rem Define el archivo de log
set "logfile=%script_dir%envios.log"

rem Comprueba si el archivo meteoclimatic.htm existe
if not exist "%datafile%" (
    echo [%date% %time%] El archivo meteoclimatic.htm no existe en "%script_dir%". >> "%logfile%"
    echo El archivo meteoclimatic.htm no existe en "%script_dir%".
    exit /b 1
)

rem Lee el archivo meteoclimatic.htm y extrae el codigo de la estacion
for /F "tokens=2 delims==" %%A in ('type "%datafile%" ^| findstr /C:"*COD="') do set "stationCode=%%A"

rem Comprueba si se ha encontrado el codigo de la estacion
if "%stationCode%"=="" (
    echo [%date% %time%] No se ha encontrado el codigo de la estacion en el archivo. >> "%logfile%"
    echo No se ha encontrado el codigo de la estacion en el archivo.
    exit /b 1
)

rem Define las variables para la comando curl
set url=https://api.m11c.net/v2/rainbow/weather.txt
set resposta=%script_dir%resposta.txt

rem Envía la solicitud con cURL
curl --data-urlencode "stationCode=%stationCode%" --data-urlencode "rawData2@%datafile%" -H "APIkey: %apikey%" -X POST -k -o "%resposta%" "%url%"

rem Comprueba si la ejecucion fue correcta
if %errorlevel% neq 0 (
    echo [%date% %time%] Error en la ejecucion de la solicitud. >> "%logfile%"
    echo Error en la ejecucion de la solicitud.
    exit /b 1
)

rem Mostrar resultado en pantalla
echo ===============================
echo Respuesta del servidor:
type "%resposta%"
echo ===============================

rem Espera 5 minutos antes de repetir el bucle
ping -n 301 127.0.0.1 >nul

goto :loop

endlocal

El script busca el fichero meteoclimatic htm en el directorio desde donde se ejecute meteoclimatic.bat

Si quieres cambiar el nombre del fichero, puedes editar por tu cuenta el script.

El unico parámetro a configurar es el API-KEY de tu estación. Debes escribirlo tal cual lo ves en la ficha de la estación, sin comillas de ningun tipo y a partir del signo igual

Es decir algo así

Código: [Seleccionar]
set apikey=elapikeydetuestacioncompletoconguionesincluidos
Una vez lo ejecutemos, se repetirá el envío cada 5 minutos.
« Última modificación: 18 de Agosto de 2025, 14:18:12 por jantoni »

Desconectado jantoni

  • Administrator
  • Hero Member
  • ******
  • Mensajes: 5.728
    • meteorivas.es
  • Estación: ESMAD2800000028522A
Re:Envío de datos con Windows
« Respuesta #1 en: 18 de Agosto de 2025, 13:53:19 »
Al haberse modificado sustancialmente el script, todos los mensajes de este hilo se han borrado.

Saludos

Desconectado jantoni

  • Administrator
  • Hero Member
  • ******
  • Mensajes: 5.728
    • meteorivas.es
  • Estación: ESMAD2800000028522A
Re:Envío de datos con Windows
« Respuesta #2 en: 18 de Agosto de 2025, 13:56:27 »
Ah.....si modificáis el script y cambíais

Código: [Seleccionar]
set url=https://api.m11c.net/v2/rainbow/weather.txt
por

Código: [Seleccionar]
set url=https://api.m11c.net/v2/rainbow/weather.json

Recibiréis la respuesta en formato json

y por

Código: [Seleccionar]
set url=https://api.m11c.net/v2/rainbow/weather.xml

Recibiréis la respuesta en formato XML....por si queréis trastear.

« Última modificación: 18 de Agosto de 2025, 17:42:31 por jantoni »

Desconectado jantoni

  • Administrator
  • Hero Member
  • ******
  • Mensajes: 5.728
    • meteorivas.es
  • Estación: ESMAD2800000028522A
Re:Envío de datos con Windows 10 y Windows 11
« Respuesta #3 en: 18 de Agosto de 2025, 17:43:26 »
Como este script es muy sencillo, se agradece que si lo modificas a mejor, lo compartas con todos nosotros.

Aquí, en Meteoclimatic, hay mucho talento.....vamos a aprovecharlo.

Saludos

Desconectado jezuleon

  • Full Member
  • ***
  • Mensajes: 198
    • ESTACIÓN JEZULEON
  • Estación: JEZULEON-JEREZ ESAND1100000011406A
Re:Envío de datos con Windows 10 y Windows 11
« Respuesta #4 en: 20 de Agosto de 2025, 12:07:24 »
Hola aquí pongo unas mejoras, que no son mías sino de chatgpt, esto crea un archivo log con los errores de envío del archivo meteoclimatic.bat a meteoclimatic, así también cuando el ordenador se queda sin internet, no se cierra el script meteoclimatic.bat, sino que sigue abierto, y con eso nos aseguramos que si hay un corte de internet en el ordenador, no se nos cierra y no tenemos que estar pendiente de si se ha cerrado o no, de todas formas, id observándolo por si acaso:

@echo off

rem #########################################################
REM ## SOLO HAY QUE CONFIGURAR LA APIKEY DE TU ESTACIÓN ##
REM #########################################################

set apikey=xxxxxxxxxxxxxxxxxxxxxxxx

rem #########################################################
rem ########   NO MODIFICAR NADA A PARTIR DE AQUI   #########
rem #########################################################

setlocal

:loop

rem Obtiene la ruta del directorio actual del script
for %%I in (%0) do set "script_dir=%%~dpI"

rem Define la ruta del archivo meteoclimatic.html
set "datafile=%script_dir%meteoclimatic.html"

rem Define el archivo de log
set "logfile=%script_dir%envios.log"

rem Comprueba si el archivo meteoclimatic.html existe
if not exist "%datafile%" (
    echo [%date% %time%] El archivo meteoclimatic.html no existe en "%script_dir%". >> "%logfile%"
    echo El archivo meteoclimatic.html no existe en "%script_dir%".
    ping -n 61 127.0.0.1 >nul
    goto :loop
)

rem Lee el archivo meteoclimatic.html y extrae el codigo de la estacion
for /F "tokens=2 delims==" %%A in ('type "%datafile%" ^| findstr /C:"*COD="') do set "stationCode=%%A"

rem Comprueba si se ha encontrado el codigo de la estacion
if "%stationCode%"=="" (
    echo [%date% %time%] No se ha encontrado el codigo de la estacion en el archivo. >> "%logfile%"
    echo No se ha encontrado el codigo de la estacion en el archivo.
    ping -n 61 127.0.0.1 >nul
    goto :loop
)

rem Define las variables para la comando curl
set url=https://api.m11c.net/v2/rainbow/weather.txt
set resposta=%script_dir%resposta.txt

rem Envía la solicitud con cURL
curl --data-urlencode "stationCode=%stationCode%" --data-urlencode "rawData2@%datafile%" -H "APIkey: %apikey%" -X POST -k -o "%resposta%" "%url%"

rem Comprueba si la ejecucion fue correcta
if %errorlevel% neq 0 (
    echo [%date% %time%] Error en la ejecucion de la solicitud. >> "%logfile%"
    echo Error en la ejecucion de la solicitud.
    ping -n 61 127.0.0.1 >nul
    goto :loop
)

rem Registrar respuesta completa en log solo si quieres (descomenta la siguiente línea)
rem type "%resposta%" >> "%logfile%"

rem Mostrar resultado en pantalla
echo ===============================
echo Respuesta del servidor:
type "%resposta%"
echo ===============================

rem Espera 5 minutos antes de repetir el bucle
ping -n 301 127.0.0.1 >nul

goto :loop

endlocal

Desconectado jezuleon

  • Full Member
  • ***
  • Mensajes: 198
    • ESTACIÓN JEZULEON
  • Estación: JEZULEON-JEREZ ESAND1100000011406A
Re:Envío de datos con Windows 10 y Windows 11
« Respuesta #5 en: 21 de Agosto de 2025, 18:58:32 »
Bueno, pues hoy he mirado si ha habido error a las 5 a.m. y efectivamente lo ha habido, pero el log no lo ha recogido, y le he preguntado a chatgpt que por qué, y me dice que el error que recogía el bat, era por desconexión, y después caí en la cuenta que a las IA hay que ponerles las peticiones y preguntas muy mascaditas, para que no haya lugar a dudas o interpretación, pues nada, se lo he vuelto a explicar, con mucha paciencia, y me ha creado otro script, que se supone que hace eso, ya veremos mañana cuando lo mire si el error sigue, que seguramente seguirá. También le pregunté a que era debido el error, le pasé el error y la respuesta que me dio fue esta:

Lo que pasa es:

A veces el servidor no reconoce bien el identificador de la estación o la firma (*SIG=... o *COD=...), y te devuelve 401 Unauthorized.

Otras veces sí lo acepta y te responde 202 Accepted.

El warning "Undefined array key 'uin'" indica que al servidor le está llegando la petición sin un parámetro que espera (probablemente el User Identification Number (UIN) o similar en la cabecera/JSON).

👉 Conclusión:
No es un fallo en tu script, sino intermitente en el servidor de Meteoclimatic, que unas veces interpreta bien los datos y otras no.


Vuelvo a pasar el script de meteoclimatic.bat con la corrección para que todos los errores que salgan en los envíos por el motivo que sea, sean incluidos en el log de errores, id comprobándolo ustedes, si te coge despierto a las 5 a.m. jajaja, lo puedes mirar, yo no lo miraré hasta mañana por la mañana, le ha puesto 3 reintentos de envío, a 30 segundos por si falla alguno, si no lo logra, ya espera al siguiente que sería a los 5 minutos:

@echo off
rem #########################################################
REM ## CONFIGURA TU APIKEY AQUÍ ##
REM #########################################################
set apikey=xxxxxxxxxxxxxxxxxxxxxxxx

rem #########################################################
REM ########   NO MODIFICAR NADA A PARTIR DE AQUI   #########
rem #########################################################

rem Obtiene la ruta del directorio actual del script
for %%I in (%0) do set "script_dir=%%~dpI"

rem Define la ruta del archivo meteoclimatic.htm
set "datafile=%script_dir%meteoclimatic.html"

rem Define el archivo de log
set "logfile=%script_dir%envios.log"

:loop
rem Comprueba si el archivo meteoclimatic.htm existe
if not exist "%datafile%" (
    echo [%date% %time%] El archivo meteoclimatic.html no existe en "%script_dir%". >> "%logfile%"
    echo El archivo meteoclimatic.html no existe en "%script_dir%".
    goto wait
)

rem Lee el archivo meteoclimatic.html y extrae el codigo de la estacion
for /F "tokens=2 delims==" %%A in ('type "%datafile%" ^| findstr /C:"*COD="') do set "stationCode=%%A"

rem Comprueba si se ha encontrado el codigo de la estacion
if "%stationCode%"=="" (
    echo [%date% %time%] No se ha encontrado el codigo de la estacion en el archivo. >> "%logfile%"
    echo No se ha encontrado el codigo de la estacion en el archivo.
    goto wait
)

rem Define la URL de envio
set "url=https://api.m11c.net/v2/rainbow/weather.txt"
set "resposta=%script_dir%resposta.txt"

rem Intentos de envio
set retries=0
:setcurl
curl --data-urlencode "stationCode=%stationCode%" --data-urlencode "rawData2@%datafile%" -H "APIkey: %apikey%" -X POST -k -o "%resposta%" "%url%"
set err=%errorlevel%

rem Analiza la respuesta del servidor
set "status="
for /f "tokens=2 delims=:" %%S in ('findstr /i "status" "%resposta%"') do set status=%%S

if %err% neq 0 (
    echo [%date% %time%] ERROR: Fallo en la ejecucion de la solicitud. Codigo: %err% >> "%logfile%"
    echo Fallo en la ejecucion de la solicitud. Reintentando en 30 segundos...
    set /a retries+=1
    if %retries% leq 2 (
        timeout /t 30 /nobreak >nul
        goto setcurl
    )
    goto wait
)

if /i "%status: =%"=="fail" (
    echo [%date% %time%] ERROR en envio: >> "%logfile%"
    type "%resposta%" >> "%logfile%"
    set /a retries+=1
    if %retries% leq 2 (
        echo Reintentando en 30 segundos...
        timeout /t 30 /nobreak >nul
        goto setcurl
    )
    goto wait
)

rem Si todo correcto, muestra respuesta
echo ===============================
echo Respuesta del servidor:
type "%resposta%"
echo ===============================

:wait
rem Espera 5 minutos antes del siguiente envio
timeout /t 300 /nobreak >nul
goto loop