Autor Tema: Subida de datos desde Ecowitt a más de un servicio "customized"  (Leído 159 veces)

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

Desconectado ipe

  • Jr. Member
  • **
  • Mensajes: 52
    • Meteo San Antón
  • Estación: ESAND2900000029018A
He visto que la Ecowitt solo permite enviar a un servicio "a medida" o "customized", por lo que me he visto con problemas para enviar los datos a tres aplicaciones diferentes que reclaman su espacio "a medida".

Para resolverlo, he creado un proxy/index.php que es el que configuro como destino "customized" en ecowitt, y al recibir el POST, lo reenvía a tres servicios (meteoclimatic, homeassistant y meteobridge).

En Ecowitt solo tengo que poner mi servidor y el path al archivo.


Adjunto el código por si os es de utilidad:

Código: [Seleccionar]
<?php
// URLs de los destinos (meteobridge, homeassistant, meteoclimatic)
$destinos = [
    
"http://192.168.1.151/public/ecowitt2.cgi",
    
"http://192.168.1.91:8123/api/webhook/d06588e76a6dbdf49abe527872ff58a2",
    
"http://api.m11c.net/v2/ew/ESAND2900000029018A/180bf5d9-xxxx-xxxx-xxxx-02000078db37"
];

// Recibir datos de Ecowitt
$datos $_POST;
$cnt 0;
$queryString http_build_query($datos);
//file_put_contents("/share/Web/casa/proxy/datos.txt", "$queryString\n", FILE_APPEND);

foreach ($destinos as $url) {
    
$ch curl_init();

        
$fullUrl $url;
        
curl_setopt($chCURLOPT_URL$fullUrl);
        
curl_setopt($chCURLOPT_POSTtrue);
        
curl_setopt($chCURLOPT_POSTFIELDShttp_build_query($datos));
        
curl_setopt($chCURLOPT_HTTPHEADER, ["Content-Type: application/x-www-form-urlencoded"]);
        
curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
        
curl_setopt($chCURLOPT_TIMEOUT5);
        
curl_setopt($chCURLOPT_FOLLOWLOCATIONtrue);

    
$response curl_exec($ch);
    
$httpCode curl_getinfo($chCURLINFO_HTTP_CODE);
    
curl_close($ch);

    
//file_put_contents("/share/Web/proxy_log.txt", date("Y-m-d H:i:s") . " - Enviado a: $url - Código HTTP: $httpCode\n", FILE_APPEND);
    
    
$cnt++;
}
echo 
"OK";
?>


« Última modificación: 01 de Marzo de 2025, 19:02:34 por ipe »

Desconectado spyfly

  • Full Member
  • ***
  • Mensajes: 305
  • Estación: Ponferrada (ESCYL2400000024411A)
Re:Subida de datos desde Ecowitt a más de un servicio "customized"
« Respuesta #1 en: 02 de Marzo de 2025, 21:10:52 »
y esto lo montas en el propio nginx de home assistant?

Waldbeck Halley: WH65 + WH2650 + WN32P (WH32P) en 868Mhz
Conexión con Home Assistant y CumulusMX
Sensores adicionales: WH40 + WH57 en 868Mhz
Pluviómetro manual homologado CoCoRaHS
https://www.ecowitt.net/home/index?id=219359

Desconectado ipe

  • Jr. Member
  • **
  • Mensajes: 52
    • Meteo San Antón
  • Estación: ESAND2900000029018A
Re:Subida de datos desde Ecowitt a más de un servicio "customized"
« Respuesta #2 en: 03 de Marzo de 2025, 19:14:04 »
Lo tengo en otro servidor, pero bien se podría poner ahí. Lo ideal es que la propia api.m11c.net pudiera encargarse de reenviarlo a otros servicios

Desconectado ipe

  • Jr. Member
  • **
  • Mensajes: 52
    • Meteo San Antón
  • Estación: ESAND2900000029018A
Re:Subida de datos desde Ecowitt a más de un servicio "customized"
« Respuesta #3 en: 05 de Marzo de 2025, 10:07:49 »
También lo estoy usando para enviar datos a la red AWEKAS (mismo protocolo que Wunderground) y para Windy

Código: [Seleccionar]
/**
 * Convierte los datos posteados en protocolo ECOWITT a protocolo WUNDERGROUND (AWEKAS)
 * @param mixed $data Datos posteados
 * @param mixed $WU_ID
 * @param mixed $WU_KEY
 * @return array|array{ID: mixed, PASSWORD: mixed, UV: mixed, action: string, baromin: mixed, dailyrainin: mixed, dateutc: string, dewptf: mixed, humidity: mixed, rainin: mixed, softwaretype: string, solarRadiation: mixed, tempf: mixed, totalrainin: mixed, winddir: mixed, windspeedmph: mixed}
 */
function ew2wu($data, $WU_ID, $WU_KEY)
{
    try {
        $wu_data = [
            'ID' => $WU_ID,
            'PASSWORD' => $WU_KEY,
            'dateutc' => 'now', 
            'tempf' => isset($data['tempf']) ? $data['tempf'] : null, 
            'humidity' => isset($data['humidity']) ? $data['humidity'] : null,
            'dewptf' => isset($data['dewptf']) ? $data['dewptf'] : null, 
            'baromin' => isset($data['baromrelin']) ? ($data['baromrelin']) : null,
            'windgustmph' => isset($data['windgustmph']) ? $data['windgustmph'] : null, 
            'windspeedmph' => isset($data['windspeedmph']) ? $data['windspeedmph'] : null, 
            'winddir' => isset($data['winddir']) ? $data['winddir'] : null,
            'rainin' => isset($data['rainratein']) ? $data['rainratein'] : null, 
            'dailyrainin' => isset($data['dailyrainin']) ? $data['dailyrainin'] : null, 
            'totalrainin' => isset($data['totalrainin']) ? $data['totalrainin'] : null, 
            'solarradiation' => isset($data['solarradiation']) ? $data['solarradiation'] : null,
            'UV' => isset($data['uv']) ? $data['uv'] : null,
            'softwaretype' => 'Ecowitt-Converter-PHP',
            'action' => 'updateraw'
        ]; 
        return $wu_data;
    } catch (Exception $e) {
        return [];
    }
}

Para usarlo...

Código: [Seleccionar]
$awquery=http_build_query(ew2wu($datos,$AW_ID,$AW_PW));
$awekasUrl = "http://ws.awekas.at/weatherstation/updateweatherstation.php?".$awquery;
file_get_contents($awekasUrl);


Y para Windy,

Código: [Seleccionar]
$windy_url = "https://stations.windy.com/pws/update/$WD_KEY?stationId=0&".$awquery;
if (date('i') % 5 == 0)
    file_get_contents($windy_url);
« Última modificación: 05 de Marzo de 2025, 11:29:02 por ipe »