Meteoclimatic
Hardware => Ecowitt y todos los clones Fine Offset => Mensaje iniciado por: ipe en 01 de Marzo de 2025, 09:32:04
-
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:
<?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($ch, CURLOPT_URL, $fullUrl);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($datos));
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-Type: application/x-www-form-urlencoded"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_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";
?>
-
y esto lo montas en el propio nginx de home assistant?
-
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
-
También lo estoy usando para enviar datos a la red AWEKAS (mismo protocolo que Wunderground) y para Windy
/**
* 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...
$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,
$windy_url = "https://stations.windy.com/pws/update/$WD_KEY?stationId=0&".$awquery;
if (date('i') % 5 == 0)
file_get_contents($windy_url);