Saltar al contenido

Datos meteorológicos SmartHome

Tiempo de leer 9 minutos

Actualizado – 20 de enero de 2023

Recopilar datos meteorológicos con SmartHome y visualizarlos a través de AIO Creator en su teléfono celular o tableta generalmente no es una necesidad, pero es bueno tenerlos.

El servicio meteorológico en línea meteorología.com ofrece hasta 250 consultas por mes, limitadas y sin cargo. Si realmente desea datos meteorológicos actualizados, debe elegir el paquete estándar. 50.000 consultas permiten intervalos de minutos.

Los paquetes que todavía están disponibles se diferencian principalmente por el número de solicitudes y una previsión meteorológica de 7 o 14 días.

Los siguientes datos están incluidos en todos los paquetes:

  • Longitud y latitud geográficas.
  • Ubicación
  • región
  • país
  • Huso horario
  • Hora y fecha locales
  • Desplazamiento UTC
  • Hora actual de recopilación de datos.
  • Temperatura del aire
  • Descripción del tiempo
  • velocidad del viento
  • Dirección del viento numérica/geográfica
  • Presión de aire
  • cantidad de lluvia
  • Humedad
  • Densidad de nubes
  • temperatura fría
  • índice ultravioleta
  • vista

El registro, independientemente del paquete, requiere los datos habituales y los datos de pago. Una suscripción anual, a diferencia de la mensual, tiene un descuento de 20%.

Después de completar con éxito este procedimiento, recibirá el llamado código API (Interfaz de programación de aplicaciones), que copiará en la URL de consulta. La respuesta es una salida XML que contiene las categorías y valores de datos anteriores. Los datos se extraen mediante scripts adecuados y se almacenan en variables. Luego se pueden utilizar para visualización en AIO Creator.

Una descripción detallada de todos los parámetros posibles en la salida XML, así como las opciones de consulta opcionales incluidas en los paquetes de mayor precio, incluidos varios ejemplos de código. aquí visible.

programa

El programa es bastante extenso debido a la gran cantidad de datos. Por lo tanto, las secciones individuales se enumeran aquí secuencialmente. En última instancia, todos los fragmentos de código se pueden combinar en un solo programa.

Además de los datos mencionados anteriormente, en el programa se calculan datos adicionales y se ponen a disposición para su visualización:

  • Elevación solar y azimut
  • Recomendación de factor de protección solar
Programa – W_Data – consulta de datos meteorológicos

encabezado del programa

El encabezado solo contiene la URL, que debe complementarse con la clave API, que aquí se muestra con xxx, y la ubicación (en texto plano o, separada por una coma, como longitud y latitud, marcada con yyy:

var url = "http://api.weatherstack.com/current?access_key=xxx&query=yyy";

Conversión de formato de hora de EE. UU. a DE

Dado que no hay opción de idioma de visualización en la tarifa estándar y gratuita, por lo que solo está disponible el formato de hora AM / PM, aquí se convierte a 24 horas.

Variable a crear:

  • W_LDU de tipo cadena

Código:

! Conversión AM/PM – guardar en W_LDU

var posValueStart;
var posValueEnd;
var posInicio;
var posEnd; cadena estándar; salida estándar de cadena;
system.Exec("wget -q -O - '"#url#"'", &stdout, &stderr);
WriteLine(salida estándar);
cadena meteorología_xml = salida estándar;

palabra de cadena = 'tiempo_observación":"';
entero longitud_palabra = palabra.Longitud();
entero posición_palabra = clima_xml.Find(palabra);
datos de cadena = meteorología_xml.Substr((posición_palabra + longitud_palabra), 5);
entero posición_palabra = datos.Buscar(palabra);
datos = datos.Substr(0, (posición_palabra -2));

palabra de cadena = 'tiempo_observación":"';
entero longitud_palabra = palabra.Longitud();
entero posición_palabra = clima_xml.Find(palabra);
cadena PM = clima_xml.Substr((posición_palabra + longitud_palabra +6), 2);
entero posición_palabra = PM.Find(palabra);
PM = PM.Substr(0, (palabra_posición -2));
WriteLine("AM/PM");WriteLine(PM);

palabra de cadena = 'tiempo_observación":"';
entero longitud_palabra = palabra.Longitud();
entero posición_palabra = clima_xml.Find(palabra);
cadena HH = clima_xml.Substr((posición_palabra + longitud_palabra) + 1, 1);
posición_palabra entera = HH.Find(palabra);
HH = HH.Substr(0, (posición_palabra -2));
WriteLine("HH");WriteLine(HH);

palabra de cadena = 'tiempo_observación":"';
entero longitud_palabra = palabra.Longitud();
entero posición_palabra = clima_xml.Find(palabra);
cadena MM = clima_xml.Substr((posición_palabra + longitud_palabra) +3, 2);
posición_palabra entera = MM.Find(palabra);
MM = MM.Substr(0, (posición_palabra -2));
WriteLine("MM");WriteLine(MM);

si (PM == "PM")
{
diferencia entera = 12;
WriteLine("Diff");WriteLine(Diff);
var HH_i = HH.ToInteger();
entero H = (HH_i + Dif);
WriteLine("HHi + Diff es = H)");WriteLine(H);
cadena HHMM = H #":";
WriteLine("H_+ : ");WriteLine(HHMM);
cadena HM = HHMM # MM;
WriteLine("HH_+12+MM");WriteLine(HM);
dom.GetObject("W_LDU").Estado(HM);
}
demás
{
WriteLine("LDU_data");WriteLine(datos);
dom.GetObject("W_LDU").State(datos);
}


País – Código de país

El código de país también se imprime en inglés y aquí se convierte al código internacional. Se pueden agregar países adicionales de acuerdo con este patrón si es necesario. Weatherstack determina automáticamente el país actual cuando selecciona la ciudad.

Variable a crear:

W_código_país de tipo cadena

Código:

! Código_país

posición = 0;
posInicio = 'país":"';
posEnd = '","región';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
cadena country_code = stdout.Substr(posValueStart, posValueEnd);

if (código_país == "Alemania")
{
cadena código_país = "DE";
}
if (código_país == "Suecia")
{
cadena código_país = "SE";
}

WriteLine("código_país");WriteLine(código_país);
dom.GetObject("W_código_país").Estado(código_país);


región

La región, por ejemplo en Alemania, se llama "Baja Sajonia" y Weatherstack también la determina automáticamente.

Variable a crear:

  • W_región de tipo cadena

Código:

! región

posición = 0;
posStart = 'región":"';
posEnd = '","lat';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
región de cadena = stdout.Substr(posValueStart, posValueEnd);
WriteLine("región");WriteLine(región);
dom.GetObject("W_region").State(región);


Ciudad

Cuando ingresa a la ciudad, Weatherstack determina automáticamente la longitud y latitud asociadas, mientras que la ciudad se determina a partir de los datos geográficos ingresados.

Variable a crear:

  • W_nombre_ciudad de tipo cadena

Código:

! nombre_ciudad

posición = 0;
posInicio = 'nombre":"';
posEnd = '","país';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
cadena nombre_ciudad = stdout.Substr(posValueStart, posValueEnd);
WriteLine("nombre_ciudad");WriteLine(nombre_ciudad);
dom.GetObject("W_nombre_ciudad").State(nombre_ciudad);


Latitud – geográfica. Ancho

Variable a crear:

  • W_Lat de tipo cadena

Código:

! Latitud

posición = 0;
posStart = 'consulta":"Lat';
posEnd = 'y Lon';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
cadena Lat = stdout.Substr(posValueStart, posValueEnd);
WriteLine("Lat");WriteLine(Lat);
dom.GetObject("W_Lat").State(Lat);


Longitud – geogr. longitud

Variable a crear:

  • W_Lon de tipo cadena

Código:

! lon

posición = 0;
posStart = 'y Lon';
posEnd = '","idioma';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
cadena Lon = stdout.Substr(posValueStart, posValueEnd);
WriteLine("Lon");WriteLine(Lon);
dom.GetObject("W_Lon").State(Lon);


Visibilidad – visibilidad

Variable a crear:

  • W_vis de tipo cadena

Código:

! Visibilidad

posición = 0;
posStart = 'visibilidad":';
posEnd = ',"es_día';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
cadena vis_data = stdout.Substr(posValueStart, posValueEnd);
WriteLine("vis_data");WriteLine(vis_data);
dom.GetObject("W_vis").State(vis_data);


Presión del aire y tendencia.

Además de la presión del aire proporcionada, este script determina la tendencia de la presión del aire guardando un valor medido como "actual" y uno anterior como "antiguo". Ambos se comparan entre sí, lo que da como resultado la tendencia.

Variable a crear:

  • W_presión_aire_act de tipo cadena
  • W_presión de aire_antiguo de tipo cadena
  • W_Tendencia de presión barométrica de tipo cadena

Código:

! Presión

var W_mb_old;
var W_mb_akt;
posición = 0;
posStart = 'presión':';
posEnd = ',"precip';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
datos = stdout.Substr(posValueStart, posValueEnd);WriteLine(datos);
real W_mb_akt = datos.ToInteger();WriteLine("W_mb_akt");WriteLine(W_mb_akt);
dom.GetObject("W_Luftdruck_akt").State(W_mb_akt);
W_mb_alt = dom.GetObject("W_Luftdruck_alt").Value();WriteLine(W_mb_alt);

si (W_mb_akt > W_mb_old)
{
dom.GetObject("W_Luftdruck_old").State(W_mb_akt);
dom.GetObject("W_Tendencia de presión de aire").State("S");
}

si (W_mb_akt < W_mb_old)
{
dom.GetObject("W_Luftdruck_old").State(W_mb_akt);
dom.GetObject("W_Tendencia de presión de aire").State("F");
}

si (W_mb_akt == W_mb_old)
{
dom.GetObject("W_Luftdruck_old").State(W_mb_akt);
dom.GetObject("W_Tendencia de presión de aire").State("N");
}


temperatura fría

La sensación térmica depende de la velocidad del viento y de la temperatura. En los deportes acuáticos también aumenta el efecto del enfriamiento por evaporación debido a la pulverización (pero esto no se tiene en cuenta aquí). El frío se refiere a la temperatura percibida, que en un ambiente muy frío puede ser hasta una vez y media la temperatura negativa en comparación con la temperatura real y puede provocar una rápida congelación.

Variable a crear:

  • W_chill de tipo cadena

Código:

! Enfriar

posición = 0;
posStart = 'se siente como":';
posEnd = ',"uv_index';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
cadena app_temp_data = stdout.Substr(posValueStart, posValueEnd);
WriteLine("app_temp_data");WriteLine(app_temp_data);
dom.GetObject("W_chill").State(app_temp_data);


Recomendación de protección contra la luz y los rayos UV.

La exposición a los rayos UV determinada en función del índice UV da como resultado una recomendación para el uso de medidas de protección contra la luz, si es necesario.

Variable a crear:

  • W_UV de tipo cadena
  • W_LSF de tipo cadena

Código:

! ultravioleta

posición = 0;
posStart = 'uv_index":';
posEnd = ',"visibilidad';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
var uv_data = stdout.Substr(posValueStart, posValueEnd);
dom.GetObject("W_UV").State(uv_data);
datos = uv_data.Substr(0, (palabra_posición -2));
número real = datos.ToInteger();
WriteLine("número UV");WriteLine(número);

cadena LSF = "";
if (número <3) {LSF = "innecesario" ;} elseif ((número >= "3") && (número <= "5")) {LSF = "recomendado" ;} elseif ((número >= "6 ") && (número <= "7")) {LSF = "requerido" ;} elseif ((número >= "8") && (número <= "9")) {LSF = "requerido" ;} elseif ( número >= "10") {LSF = "DEBE";}
dom.GetObject("W_LSF").State(LSF);WriteLine("LSF");WriteLine(LSF);


velocidad del viento

Variable a crear:

  • W_WdSpd de tipo número

Código:

! velocidad del viento

posición = 0;
posStart = 'velocidad_viento":';
posEnd = ',"viento_grado';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
var wind_spd_daten = stdout.Substr(posValueStart, posValueEnd);
x real = wind_spd_data.ToFloat();
dom.GetObject("W_WdSpd").State(x);


Conversiones de velocidad del viento

Dado que existen diferentes medidas preferidas de la velocidad del viento en diferentes regiones, países y aplicaciones, aquí está la conversión de m/s a km/h, nudos y Beaufort.

Variable a crear:

  • W_viento_kmh de tipo número
  • W_Viento_knh de tipo número
  • W_Wind_Bft de tipo número

Código:

real W_Wind_kmh = (wind_spd_daten.ToFloat() * 3.6);WriteLine("W_Wind_kmh");WriteLine(W_Wind_kmh);
dom.GetObject("W_Wind_kmh").Estado(W_Wind_kmh);


real W_Wind_knh = (W_Wind_kmh / 1.852);WriteLine("W_Wind_knh");WriteLine(W_Wind_knh);
dom.GetObject("W_Wind_knh").Estado(W_Wind_knh);

si (x < 0,30)
{
dom.GetObject(“W_Wind_Bft”).Estado(0);
}
si ((0,29 < x) && (x < 1,51))
{
dom.GetObject(“W_Wind_Bft”).Estado(1);
}
si ((1,59 < x) && (x < 3,31))
{
dom.GetObject(“W_Wind_Bft”).Estado(2);
}
si ((3,39 < x) && (x < 5,41))
{
dom.GetObject(“W_Wind_Bft”).Estado(3);
}
si ((5,49 < x) && (x < 7,91))
{
dom.GetObject(“W_Wind_Bft”).Estado(4);
}
si ((7,99 < x) && (x < 10,71))
{
dom.GetObject(“W_Wind_Bft”).Estado(5);
}
si ((10,79 < x) && (x < 13,81))
{
dom.GetObject(“W_Wind_Bft”).Estado(6);
}
si ((12,89 < x) && (x < 17,11))
{
dom.GetObject(“W_Wind_Bft”).Estado(7);
}
si ((17,19 < x) && (x < 20,71))
{
dom.GetObject(“W_Wind_Bft”).State(8);
}
si ((20,79 < x) && (x < 24,41))
{
dom.GetObject(“W_Wind_Bft”).State(9);
}
si ((24,49 < x) && (x < 28,41))
{
dom.GetObject(“W_Wind_Bft”).Estado(10);
}
si ((28,49 < x) && (x < 32,61))
{
dom.GetObject(“W_Wind_Bft”).Estado(11);
}
si (x > 32,6)
{
dom.GetObject(“W_Wind_Bft”).Estado(12);
}

Velocidad del viento: riesgo de congelación

Cualquiera que viaje a zonas muy frías recibirá un aviso con este guión si existe riesgo de congelación debido a la velocidad del viento y a la temperatura exterior percibida si no se utiliza la ropa protectora adecuada.

El cálculo supone que con una exposición de la piel durante 30 minutos o menos, se puede esperar que la temperatura de la piel baje a -4,8 °C y que se produzca congelación en personas a 5%.

Variable a crear:

  • Tipo W_Wind_Danger booleano

Código:

if (((app_temp_data == -27.2) && (8 > W_Wind_kmh <10.1)) || ((app_temp_data == -22.9) && (12 > W_Wind_kmh <15.1)) || ((app_temp_data == -24.2) && ( 18 > W_wind_kmh <20.1)) || ((app_temp_data == -25.2) && (23 > W_wind_kmh <25.1)) || -26.8) && (32 > W_Wind_kmh <35.1)) || ((app_temp_data == -27.4) && (37 > W_Wind_kmh <40.1)) || )) ||. > W_Viento_kmh <50,1)) || && (57 > W_Viento_kmh <60,1)))
{
dom.GetObject("W_Wind_Danger").Estado(verdadero);
}
demás
{
dom.GetObject("W_Wind_Danger").Estado(falso);
}


Dirección del viento (geográfica)

Variable a crear:

  • W_wind_dir de tipo cadena

Código:

! Dirección del viento geográficamente

posición = 0;
posStart = 'wind_dir":"';
posEnd = '","presión';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
cadena wind_dir_data = stdout.Substr(posValueStart, posValueEnd);
WriteLine("W_wind_dir");WriteLine(wind_dir_daten);
dom.GetObject("W_wind_dir").State(wind_dir_daten);


Dirección del viento (numérica)

Variable a crear:

  • W_Wind_rchtg de tipo cadena

Código:

! Dirección del viento numéricamente

posición = 0;
posStart = 'grado_viento":';
posEnd = ',"wind_dir';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
cadena W_wind_rchtg = stdout.Substr(posValueStart, posValueEnd);
WriteLine("W_wind_rchtg");WriteLine(W_wind_rchtg);
dom.GetObject("W_wind_rchtg").State(W_wind_rchtg);


Cubierta de nubes

La capa de nubes también está escrita en inglés por Weatherstack, por lo que aquí se hace la traducción al alemán.

Variable a crear:

  • W_descripción de tipo cadena

Código:

! Descripción de la nubosidad

posición = 0;
posStart = 'weather_descriptions":["';
posEnd = '"],"wind_speed';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
cadena nubes_descripción = stdout.Substr(posValueStart, posValueEnd);
WriteLine("clouds_description_ES");WriteLine(clouds_description);

if (nubes_description == "Nublado")
{
string nubes_descripción_DE = "Nublado";
WriteLine("nubes_description_DE");WriteLine(nubes_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (nubes_description == "Lluvia ligera")
{
string nubes_descripción_DE = "Lluvia ligera";
WriteLine("nubes_description_DE");WriteLine(nubes_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Lluvia ligera")
{
stringclouds_description_DE = "Lluvias ligeras";
WriteLine("nubes_description_DE");WriteLine(nubes_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (nubes_description == "Llovizna ligera")
{
string nubes_descripción_DE = "Llovizna";
WriteLine("nubes_description_DE");WriteLine(nubes_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (nubes_description == "Mis")
{
cadena nubes_descripción_DE = "Neblina";
WriteLine("nubes_description_DE");WriteLine(nubes_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Nieve ligera")
{
stringclouds_description_DE = "Nevadas ligeras";
WriteLine("nubes_description_DE");WriteLine(nubes_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (nubes_descripción == "Soleado")
{
string nubes_descripción_DE = "Heiter";
WriteLine("nubes_description_DE");WriteLine(nubes_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (nubes_description == "Nublado")
{
string nubes_descripción_DE = "Nublado";
WriteLine("nubes_descripción");WriteLine(nubes_descripción_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Parcialmente nublado")
{
string nubes_descripción_DE = "Parcialmente nublado";
WriteLine("nubes_description_DE");WriteLine(nubes_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (nubes_descripción == "Borrar")
{
cadena nubes_descripción_DE = "Borrar";
WriteLine("nubes_description_DE");WriteLine(nubes_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (nubes_description == "Niebla")
{
cadena nubes_descripción_DE = "Niebla";
WriteLine("nubes_description_DE");WriteLine(nubes_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Es posible que llueva irregularmente")
{
stringclouds_description_DE = "Es posible que llueva ligeramente";
WriteLine("nubes_descripción");WriteLine(nubes_descripción_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (nubes_description == "Lluvia moderada")
{
stringclouds_description_DE = "Precipitación moderada";
WriteLine("nubes_descripción");WriteLine(nubes_descripción_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}


Cubierta de nubes

Variable a crear:

  • W_nubes de tipo cadena

Código:

! Cubierta de nubes

posición = 0;
posStart = 'cubierta de nubes":';
posEnd = ',"se siente como';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
cadena nubes_data = stdout.Substr(posValueStart, posValueEnd);
WriteLine("nubes_data");WriteLine(nubes_data);
dom.GetObject("W_clouds").State(nubes_data);


Pronostico de lluvia

Variable a crear:

  • W_Precipitación de tipo cadena

Código:

! Pronostico de lluvia

varx;
posición = 0;
posStart = 'precip":';
posEnd = ',"humedad';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
cadena precip = stdout.Substr(posValueStart, posValueEnd);
WriteLine("Precipitación");WriteLine(precipitación);
dom.GetObject("W_Precipitation").State(precipitación);


Elevación – Azimut

El guión fue escrito por faro de radio escrito y el Foro Homemático tomado de la página 10 del hilo vinculado.

Se deben crear dos variables del sistema:

  • elevación_sol sustantivo , femenino— de tipo Número
  • sol_azimut de tipo Número

¿Por qué sólo 4 minutos? Porque la Tierra completa su círculo de 360° alrededor del sol una vez cada 24 horas. 360° / 24h = 15° por hora, correspondiente a 60 minutos / 15° = 4 minutos.

El script debe usarse independientemente de los scripts anteriores o del programa asociado, siempre que el intervalo de actualización sea diferente de 4 minutos.

Programa:

Programa – determinación de elevación/azimut

Variables a crear:

  • sol_azimut de tipo número
  • elevación_sol de tipo número

Código:

! Obtener latitud
phi real = system.Latitude();
fi = 0,017453292 * fi;


! Conversión a radianes
! Calcular sin_phi y cos_phi con series de Taylor
temperatura real = fi * fi;
real sin_phi =phi * ((temp * temp * 0.0083334) +1.0 - (temp * 0.1666667));


! aproximación seno
cos_phi real = (temperatura *temp *0,0416667) + 1,0 - (temperatura * 0,5);


! aproximación del coseno
! Cálculo del tiempo solar, todos los tiempos en minutos.
entero time_min = system.Date("%M").ToInteger() + 60sistema.Fecha("%H").ToInteger(); inicio entero de day_min = system.SunriseTime("%M").ToInteger() + 60system.SunriseTime("%H").ToInteger();
entero final del día_min = system.SunsetTime("%M").ToInteger() + 60* system.SunsetTime("%H").ToInteger();
hora solar entera = hora_min + 720 - 0,5 *(inicio del día_min + fin del día_min);
if (hora solar > 1440) {hora solar = hora solar -1440;}
if (hora solar < 1) {hora solar = 1440 + hora solar;} tarde booleana =false; if (hora solar > 720) {hora solar =hora solar - 720; tarde = verdadero; }
else {tiempo solar =720 -tiempo solar;}


! Cálculo sin_tau y cos_tau
tau real = 0,00436332313 * hora solar; ! 15/60 * pi /180 * hora solar [0 < tau < pi ] if (tau < 1.570796327) {temp = tau * tau; real sin_tau =tau * ((temp * temp * 0.0083334) +1.0 - (temp *0.1666667)); tau= 1,570796327 - tau; temperatura = tau * tau; real cos_tau =tau * ((temp * temp * 0.0083334) +1.0 - (temp * 0.1666667));} else {real tau1 =3.141592654 - tau; temperatura = tau1 * tau1; real sin_tau =tau1 * ((temp * temp * 0.0083334) +1.0 - (temp * 0.1666667)); tau = tau - 1,570796327; temperatura = tau * tau; real cos_tau = (tau) (-1.0) ((temp * temp * 0.0083334) +1.0 - (temp * 0.1666667));}

! Delta de cálculo
número de día entero = system.Date("%j").ToInteger(); número de día = número de día +10; if (número de día > 365) {número de día = número de día - 365;}
if (número de día < 92) {día real = 0,0172142 * número de día;temp = día * día; delta real = (-0.410152) *((temp *temp *0.041666) + 1.0 - (temp * 0.5));} if ((número de día >91) && (número de día < 184)) {número de día = 183 - día número; día real = 0,0172142 *número de día; temperatura = día * día; delta real = (0.410152) *((temp *temp *0.041666) + 1.0 - (temp * 0.5));} if ((número de día >183) && (número de día < 275)) {número de día = número de día - 183 ; día real = 0,0172142 *número de día; temperatura = día * día; delta real = (0.410152) *((temp *temp *0.041666) + 1.0 - (temp * 0.5));} if ((número de día >274) && (número de día < 366)) {número de día = 365 - número de día ; día real = 0,0172142 *número de día; temperatura = día * día; delta real = (-0,410152) *((temp *temp *0,041666) + 1,0 - (temp * 0,5));}

! cálculo sin_delta, cos_delta
temperatura = delta * delta; real sin_delta =delta * ((temp * temp * 0.0083334) +1.0 - (temp * 0.1666667)); !aproximación sinusal cos_delta real = (temp *temp *0.0416667) + 1.0 - (temp * 0.5);

! aproximación del coseno
! Cálculo de tan_delta con linealización por partes de tan
vsign booleano = verdadero; si (delta< 0,0) {vsign = falso; delta = (-1,0) *delta;} real tan_delta = 1,0233 * delta; si (delta >=0,2618) {tan_delta = (1,1822*delta) - 0,0416;}
if (vsign == false) {tan_delta = (-1.0) * tan_delta;}


! Cálculo sin_elevation y tan_azimuth
elevación_sin_real = (sin_phi * sin_delta) +( cos_phi * cos_delta * cos_tau);
temp = sin_elevación * sin_elevación;
elevación_sol real = elevación_sin * (1,0 + (0,1666667 * temperatura) + (0,075 * temperatura * temperatura));
elevación_sol = 57.29577951 * elevación_sol;
denominador real = (sin_phi*cos_tau) - (cos_phi * tan_delta);
if (denominador < 0.0) {booleano plus180 = verdadero;} real tan_azimuth = sin_tau / denominador;


! Cálculo de sun_azimuth con linealización por partes del arctan
signo booleano = verdadero; if (tan_azimuth < 0.0) { signo = falso; tan_azimuth = (-1.0)*tan_azimuth;} real sun_azimuth = 0.97723 * tan_azimuth; if ((tan_azimuth >=0.2679)&&(tan_azimuth < 0.5774)) {sun_azimuth = (0.84588* tan_azimuth) + 0.035189;} if ((tan_azimuth >= 0.5774)&&(tan_azimuth < 1.0)) {sun_azimuth = (0.6195* tan_azimu th) + 0.1659;} if ((tan_azimuth >= 1.0)&&(tan_azimuth < 1.3032)) {sun_azimuth = (0.43173* tan_azimuth) + 0.3537;} if ((tan_azimuth >= 1.3032)&&(tan_azimuth < 1.7321)) {sun_azimuth = ( 0.3052* tan_azimuth) + 0.51856;} if ((tan_azimuth >= 1.7321)&&(tan_azimuth < 2.4142)) {sun_azimuth = (0.1919* tan_azimuth) + 0.7148;} if ((tan_azimuth >= 2.4142)&&(tan_azimuth < 2. 9459)) {sun_azimuth = (0.123* tan_azimuth) + 0.88115;} if ((tan_azimuth >= 2.9459)&&(tan_azimuth < 3.7321)) {sun_azimuth = (0.083312* tan_azimuth) + 0.9981;} if ((tan_azimuth >= 3.7321)&&( tan_azimut < 5,0)) {azimut_sol = (0,050792* azimut tan) + 1,1194;} if ((azimuth tan >= 5,0)&&(azimuth tan <7,0)) {azimut_sol = (0,02775* azimut tan) + 1,23465;} if ((azimuth tan >= 7,0 )&&(tan_azimuth <12.0)) {sun_azimuth = (0.01175117* tan_azimuth) + 1.346641;} if ((tan_azimuth >= 12.0)&&(tan_azimuth <20.0)) {sun_azimuth = (0.004147854* tan_azimuth) + 1.437881 ;} si (( tan_azimuth >= 20.0)&&(tan_azimuth <50.0)) {sun_azimuth = (0.0009987* tan_azimuth) + 1.5008639;} if (tan_azimuth >= 50.0) {sun_azimuth = (0.000099983* tan_azimuth) + 1.54579974;}
si (azimut_sol > 1,5707963278) {azimut_sol = 1,5707963278;}
if (signo == falso) {azimut_sol = (-1.0) * azimut_sol;}
azimut_sol = 57,29577951 * azimut_sol;
if (plus180 == verdadero) {azimut_sol = azimut_sol + 180,0;}


! Corrección diaria y guardado de valores en variables del sistema.
si (tarde == falso)
{azimut_sol = 180,0 - azimut_sol; hora solar = 720 - hora solar;}
demás
{azimut_sol = azimut_sol + 180,0; hora solar = 720 + hora solar;}
azimut_sol = 0,1 ((azimut_sol10.0) .ToInteger());
elevación_sol = 0,1 ((elevación_sol10.0) .ToInteger());
dom.GetObject("sonne_elevation").State(sonne_elevation);
dom.GetObject("sun_azimuth").State(sun_azimuth);

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

es_ESEspañol