6
« en: 06 de Diciembre del 2024, 22:45:08 pm »
Buenas,
Soy nuevo en todo esto, hace poco me compré una Ecowitt Wittboy, la tengo integrada en Homeassistant y quería enviar también los datos a esta plataforma.
Mirando los protocolos veo que localmente solo deja crear un servidor, por lo que gracias a chatgpt y después de varias pruebas he creado un script de python muy simple que lo que hace es recibir los datos directamente de la estación por el protocolo ecowitt y después estos los redirige a mi servidor de homeassistant y también a meteoclimatic, de forma que es como si tuviera configurados dos DIY servers en la estación.
Decir que la idea es tener un server linux para esto, yo tengo todo virtualizado en proxmox, pero una simple raspberry serviría.
Archivo: ecowitt.py:
from flask import Flask, request
import requests
import json
import os
from datetime import datetime
# Configuración inicial
HOME_ASSISTANT_WEBHOOK = "http://server_ha:8123/api/webhook/XXXXXXXXXXXXX" # Cambia esto si usas otro webhook.
METEOCLIMATIC_API = "http://api.m11c.net/v2/ew/{station_code}/{api_key}" # Ruta base de Meteoclimatic
STATION_CODE = "ESXXXXXXXXXXXXXX" # Sustituye por tu código de estación de Meteoclimatic
API_KEY = "XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX" # Sustituye por tu API key de Meteoclimatic
LOG_FILE = "weather_data.log" # Archivo para almacenar datos localmente
DEBUG_FILE = "debug.log" # Archivo para guardar información de debug
# Inicializar servidor Flask
app = Flask(__name__)
@app.route('/api/data', methods=['POST'])
def receive_data():
try:
# Recibir datos enviados por la estación Ecowitt
data = request.form.to_dict() if request.form else request.args.to_dict()
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# Guardar datos en un archivo local (opcional)
# with open(LOG_FILE, "a") as log:
# log.write(json.dumps(data) + "\n")
# Debug: Escribir datos recibidos
# with open(DEBUG_FILE, "a") as debug:
# debug.write(f"[{current_time}] Datos recibidos: {json.dumps(data)}\n")
# Enviar datos a Home Assistant como la propia estación
try:
ha_response = requests.post(HOME_ASSISTANT_WEBHOOK, data=data)
ha_status = ha_response.status_code
with open(DEBUG_FILE, "a") as debug:
debug.write(f"[{current_time}]: Enviado a Home Assistant. Estado: {ha_status}\n")
except Exception as e:
with open(DEBUG_FILE, "a") as debug:
debug.write(f"[{current_time}]: Error enviando a Home Assistant: {e}\n")
ha_status = "Error"
# Enviar datos a Meteoclimatic como la propia estación
try:
meteoclimatic_url = METEOCLIMATIC_API.format(station_code=STATION_CODE, api_key=API_KEY)
mc_response = requests.post(meteoclimatic_url, data=data)
mc_status = mc_response.status_code
with open(DEBUG_FILE, "a") as debug:
debug.write(f"[{current_time}]: Enviado a Meteoclimatic. Estado: {mc_status}\n")
except Exception as e:
with open(DEBUG_FILE, "a") as debug:
debug.write(f"[{current_time}]: Error enviando a Meteoclimatic: {e}\n")
mc_status = "Error"
# Respuesta al cliente (estación Ecowitt)
return "OK", 200
except Exception as e:
with open(DEBUG_FILE, "a") as debug:
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
debug.write(f"[{current_time}] Error procesando datos: {e}\n")
return "Error interno del servidor", 500
if __name__ == "__main__":
# Ejecutar el servidor Flask
port = 80 # Cambia si deseas usar otro puerto
app.run(host="0.0.0.0", port=port)
En los protocolos de Ecowitt hay que configurarlos que apunten a la IP donde ejecutes este script, con path=/api/data, puerto 80 (lo puedes cambiar) y intervalo de 60 segundos.