Tabla de contenido
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
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 cadenaW_presión de aire_antiguo
de tipo cadenaW_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 cadenaW_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úmeroW_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úmerosol_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:
Variables a crear:
sol_azimut
de tipo númeroelevación_sol
de tipo número
Código:
! Obtener latitudphi real = system.Latitude();
fi = 0,017453292 * fi;
! Conversión a radianes
! Calcular sin_phi y cos_phi con series de Taylortemperatura 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_tautau 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álculonú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 tanvsign 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_azimuthelevació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 arctansigno 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);