Avançar para o conteúdo

Dados meteorológicos SmartHome

Índice

Tempo de leitura 9 minutos

Aktualisiert – Januar 20, 2023

Registar dados meteorológicos com o SmartHome e visualizá-los no seu telemóvel ou tablet através do AIO Creator não é geralmente uma necessidade, mas é bom tê-los.

O serviço meteorológico em linha weatherstack.com oferece até 250 consultas por mês - gratuitas até certo ponto. Se quiser realmente dados meteorológicos actualizados, deve escolher o pacote standard. 50.000 consultas permitem intervalos de minutos.

Os outros pacotes disponíveis diferem principalmente no número de consultas e numa previsão meteorológica de 7 ou 14 dias.

Os seguintes dados estão incluídos em todos os pacotes:

  • Longitude e latitude geográficas
  • Localização
  • Região
  • País
  • Fuso horário
  • Hora e data locais
  • Desvio UTC
  • Hora atual da recolha de dados
  • Temperatura do ar
  • Descrição meteorológica
  • Velocidade do vento
  • Direção do vento numérica / geográfica
  • Pressão do ar
  • Precipitação
  • Humidade
  • Densidade das nuvens
  • Temperatura de arrefecimento
  • Índice UV
  • Ver

O registo, independentemente do pacote, requer as informações e os dados de pagamento habituais. Uma subscrição anual, por oposição a uma subscrição mensal, tem um desconto com o 20%.

Uma vez concluído com êxito este procedimento, o utilizador recebe um código API (Application Programming Interface), que deve ser copiado para o url de consulta. A resposta é uma saída XML que contém as categorias de dados e os valores acima mencionados. Os dados são extraídos através de scripts adequados e armazenados em variáveis. Estes podem depois ser utilizados para visualização no AIO Creator.

Uma descrição detalhada de todos os parâmetros possíveis na saída XML, bem como as opções de consulta opcionais incluídas nos pacotes mais caros, incluindo vários exemplos de código, aqui visível.

programa

O programa é bastante extenso devido à grande quantidade de dados. Por isso, as secções individuais são listadas sequencialmente aqui. Todos os trechos de código podem, em última análise, ser combinados num único programa.

Para além dos dados acima mencionados, são calculados no programa dados adicionais que são disponibilizados para visualização:

  • Elevação e azimute do sol
  • Recomendação do fator de proteção contra a luz
Programa - W_Data - Consulta de dados meteorológicos

Cabeçalho do programa

O cabeçalho contém apenas o URL, que deve ser completado pela chave da API, aqui apresentada como xxx, e a localização (em texto simples ou, separada por uma vírgula, como longitude e latitude, designada por yyy):

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

Conversão do formato da hora US para DE

Como não há seleção do idioma de visualização na tarifa livre e na tarifa standard, e, por conseguinte, apenas está disponível o formato da hora AM / PM, este é convertido para o formato de 24 horas.

Variável a ser criada:

  • W_LDU do tipo corda

Código:

! Conversão AM/PM - Guardar em W_LDU

var posValueStart;
var posValueEnd;
var posStart;
var posEnd; string stderr; string stdout;
system.Exec("wget -q -O - '"#url#"'", &stdout, &stderr);
WriteLine(stdout);
string wetter_xml = stdout;

string word = 'observation_time":"';
integer word_length = word.Length();
integer palavra_posição = wetter_xml.Find(palavra);
string data = wetter_xml.Substr((posição_da_palavra + desafio_da_palavra), 5);
integer palavra_posição = data.Find(palavra);
dados = dados.Substr(0, (posição_da_palavra -2));

string word = 'observation_time":"';
integer word_length = word.Length();
integer palavra_posição = wetter_xml.Find(palavra);
string PM = wetter_xml.Substr((posição_da_palavra + desafio_da_palavra +6), 2);
integer palavra_posição = PM.Find(palavra);
PM = PM.Substr(0, (posição_da_palavra -2));
WriteLine("AM/PM");WriteLine(PM);

string word = 'observation_time":"';
integer word_length = word.Length();
integer palavra_posição = wetter_xml.Find(palavra);
string HH = wetter_xml.Substr((posição_da_palavra + desafio_da_palavra) + 1, 1);
integer palavra_posição = HH.Find(palavra);
HH = HH.Substr(0, (posição_da_palavra -2));
WriteLine("HH");WriteLine(HH);

string word = 'observation_time":"';
integer word_length = word.Length();
integer palavra_posição = wetter_xml.Find(palavra);
string MM = wetter_xml.Substr((posição_da_palavra + desafio_da_palavra) +3, 2);
integer palavra_posição = MM.Find(palavra);
MM = MM.Substr(0, (posição_da_palavra -2));
WriteLine("MM");WriteLine(MM);

se (PM == "PM")
{
inteiro Diff = 12;
WriteLine("Diff");WriteLine(Diff);
var HH_i = HH.ToInteger();
inteiro H = (HH_i + Diff);
WriteLine("HHi + Diff is = H)");WriteLine(H);
string HHMM = H #":";
WriteLine("H_+ : ");WriteLine(HHMM);
string HM = HHMM # MM;
WriteLine("HH_+12+MM");WriteLine(HM);
dom.GetObject("W_LDU").State(HM);
}
outro
{
WriteLine("LDU_daten");WriteLine(daten);
dom.GetObject("W_LDU").State(data);
}


País - Código do país

O código do país também é emitido em inglês e convertido no código internacional aqui. Outros países podem ser adicionados de acordo com este padrão, se necessário. O país atual é automaticamente determinado pela cidade selecionada pelo Weatherstack.

Variável a ser criada:

W_código do país do tipo corda

Código:

! Código do país

posição = 0;
posStart = 'country":"';
posEnd = '", "região";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string country_code = stdout.Substr(posValueStart, posValueEnd);

se (código_do_país == "Alemanha")
{
string country_code = "DE";
}
se (código_do_país == "Suécia")
{
string country_code = "SE";
}

WriteLine("código_do_país");WriteLine(código_do_país);
dom.GetObject("W_country_code").State(country_code);


Região

A região designa, por exemplo, a "Baixa Saxónia" na Alemanha e é também determinada automaticamente pelo Weatherstack.

Variável a ser criada:

  • W_região do tipo corda

Código:

! região

posição = 0;
posStart = 'region":"';
posEnd = '", "lat';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string region = stdout.Substr(posValueStart, posValueEnd);
WriteLine("região");WriteLine(região);
dom.GetObject("W_region").State(region);


Cidade

Ao introduzir a cidade, o Weatherstack determina automaticamente os dados de longitude e latitude correspondentes, enquanto a cidade é determinada a partir dos geodados introduzidos.

Variável a ser criada:

  • Nome_da_cidade do tipo corda

Código:

! Cidade_nome

posição = 0;
posStart = 'name":"';
posEnd = '", "country";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string nome_cidade = stdout.Substr(posValueStart, posValueEnd);
WriteLine("nome_da_cidade");WriteLine(nome_da_cidade);
dom.GetObject("W_city_name").State(city_name);


Latitude - geogr. Latitude

Variável a ser criada:

  • W_Lat do tipo corda

Código:

! Lat

posição = 0;
posStart = "query": "Lat";
posEnd = "e Lon";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string Lat = stdout.Substr(posValueStart, posValueEnd);
WriteLine("Lat");WriteLine(Lat);
dom.GetObject("W_Lat").State(Lat);


Longitude - longitude

Variável a ser criada:

  • W_Lon do tipo corda

Código:

! Lon

posição = 0;
posStart = "e Lon";
posEnd = '", "língua";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string Lon = stdout.Substr(posValueStart, posValueEnd);
WriteLine("Lon");WriteLine(Lon);
dom.GetObject("W_Lon").State(Lon);


Ver - visibilidade

Variável a ser criada:

  • W_vis do tipo corda

Código:

! Visibilidade

posição = 0;
posStart = 'visibility":';
posEnd = ', "is_day';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string vis_daten = stdout.Substr(posValueStart, posValueEnd);
WriteLine("vis_Daten");WriteLine(vis_daten);
dom.GetObject("W_vis").State(vis_data);


Pressão e tendência do ar

Para além da pressão atmosférica fornecida, a tendência da pressão atmosférica é determinada neste script, guardando um valor medido como "atual" e um valor anterior como "antigo". Ambos são comparados um com o outro, resultando na tendência.

Variável a ser criada:

  • W_acto_de_pressão_do_ar do tipo corda
  • W_pressão_do_ar_antigo do tipo corda
  • W_Tendência da pressão atmosférica do tipo corda

Código:

! Imprimir

var W_mb_alt;
var W_mb_akt;
posição = 0;
posStart = "pressão":';
posEnd = ', "precip";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
dados = stdout.Substr(posValueStart, posValueEnd);WriteLine(dados);
real W_mb_akt = daten.ToInteger();WriteLine("W_mb_akt");WriteLine(W_mb_akt);
dom.GetObject("W_air_pressure_act").State(W_mb_act);
W_mb_alt = dom.GetObject("W_Luftdruck_alt").Value();WriteLine(W_mb_alt);

se (W_mb_akt > W_mb_alt)
{
dom.GetObject("W_air_pressure_old").State(W_mb_akt);
dom.GetObject("W_Air pressure trend").State("S");
}

se (W_mb_akt < W_mb_alt)
{
dom.GetObject("W_air_pressure_old").State(W_mb_akt);
dom.GetObject("W_Air pressure trend").State("F");
}

se (W_mb_akt == W_mb_alt)
{
dom.GetObject("W_air_pressure_old").State(W_mb_akt);
dom.GetObject("W_Air pressure trend").State("N");
}


Temperatura de arrefecimento

O arrefecimento pelo vento depende da velocidade do vento e da temperatura. Nos desportos aquáticos, o efeito do arrefecimento evaporativo devido à pulverização é também um fator adicional (que não é aqui tido em conta). O arrefecimento refere-se à temperatura sentida, que em ambientes muito frios pode ser até uma vez e meia a temperatura negativa em comparação com a temperatura real e pode levar rapidamente a queimaduras pelo frio.

Variável a ser criada:

  • W_chill do tipo corda

Código:

! Frio

posição = 0;
posStart = 'feelslike":';
posEnd = ', "uv_index";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string app_temp_daten = stdout.Substr(posValueStart, posValueEnd);
WriteLine("app_temp_data");WriteLine(app_temp_data);
dom.GetObject("W_chill").State(app_temp_daten);


Recomendação de proteção contra raios UV e luz

A exposição aos raios UV determinada com base no índice UV resulta numa recomendação para a eventual utilização de medidas de proteção contra a luz.

Variável a ser criada:

  • W_UV do tipo corda
  • W_LSF do tipo corda

Código:

! UV

posição = 0;
posStart = 'uv_index":';
posEnd = ', "visibility";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
var uv_daten = stdout.Substr(posValueStart, posValueEnd);
dom.GetObject("W_UV").State(uv_daten);
dados = uv_data.Substr(0, (posição da palavra -2));
número real = dados.ToInteger();
WriteLine("Número UV");WriteLine(número);

string LSF = "";
se (número = "3") && (número = "6") && (número = "8") && (número = "10") {LSF = "DEVE" ;}
dom.GetObject("W_LSF").State(LSF);WriteLine("LSF");WriteLine(LSF);


Velocidade do vento

Variável a ser criada:

  • W_WdSpd do tipo pagar

Código:

! Velocidade do vento

posição = 0;
posStart = 'wind_speed":';
posEnd = ', "wind_degree";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
var wind_spd_daten = stdout.Substr(posValueStart, posValueEnd);
real x = wind_spd_daten.ToFloat();
dom.GetObject("W_WdSpd").State(x);


Velocidade do vento - Conversões

Como existem diferentes medidas de velocidade do vento preferidas em diferentes regiões, países e aplicações, eis a conversão de m/s para km/h, nós e Beaufort.

Variável a ser criada:

  • W_Vento_kmh do tipo pagar
  • W_Wind_knh do tipo pagar
  • W_Wind_Bft do tipo pagar

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").State(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").State(W_Wind_knh);

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

Velocidade do vento - risco de queimaduras pelo frio

Qualquer pessoa que viaje em zonas muito frias receberá um aviso com este guião se houver risco de queimaduras pelo frio devido à velocidade do vento e à temperatura exterior percebida, a menos que seja utilizado vestuário de proteção adequado.

O cálculo baseia-se no pressuposto de que uma queda da temperatura da pele para -4,8 °C pode ser assumida para uma exposição da pele de 30 minutos ou menos, o que significa que o congelamento ocorre em 5% das pessoas.

Variável a ser criada:

  • W_Wind_danger do tipo booleano

Código:

if (((app_temp_data == -27.2) && (8 > W_Wind_kmh W_Wind_kmh W_Wind_kmh W_Wind_kmh W_Wind_kmh W_Wind_kmh W_Wind_kmh W_Wind_kmh W_Wind_kmh W_Wind_kmh W_Wind_kmh <60,1)))
{
dom.GetObject("W_Wind_Danger").State(true);
}
outro
{
dom.GetObject("W_Wind_Danger").State(false);
}


Direção do vento (geográfica)

Variável a ser criada:

  • W_wind_dir do tipo corda

Código:

! Direção geográfica do vento

posição = 0;
posStart = 'wind_dir":"';
posEnd = '", "pressão";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string wind_dir_daten = stdout.Substr(posValueStart, posValueEnd);
WriteLine("W_wind_dir");WriteLine(wind_dir_data);
dom.GetObject("W_wind_dir").State(wind_dir_daten);


Direção do vento (numérica)

Variável a ser criada:

  • W_Wind_rchtg do tipo corda

Código:

! Direção do vento numérica

posição = 0;
posStart = 'wind_degree":';
posEnd = ', "wind_dir";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string W_wind_rchtg = stdout.Substr(posValueStart, posValueEnd);
WriteLine("W_wind_rchtg");WriteLine(W_wind_rchtg);
dom.GetObject("W_wind_rchtg").State(W_wind_rchtg);


Cobertura de nuvens

A cobertura de nuvens também é escrita em inglês pelo Weatherstack, razão pela qual a tradução para alemão é fornecida aqui.

Variável a ser criada:

  • W_descrição do tipo corda

Código:

! Descrição do manto de nuvens

posição = 0;
posStart = 'weather_descriptions":["';
posEnd = '"], "wind_speed';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string clouds_description = stdout.Substr(posValueStart, posValueEnd);
WriteLine("clouds_description_EN");WriteLine(clouds_description);

se (clouds_description == "Cloudy")
{
string clouds_description_DE = "Nublado";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
se (clouds_description == "Chuva ligeira")
{
string clouds_description_EN = "Chuva ligeira";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
se (clouds_description == "Chuva ligeira")
{
string clouds_description_EN = "Aguaceiros ligeiros";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
se (clouds_description == "Light drizzle")
{
string clouds_description_DE = "Chuvisco";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
se (clouds_description == "Mis")
{
string clouds_description_DE = "neblina";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
se (clouds_description == "Leves aguaceiros de neve")
{
string clouds_description_EN = "Aguaceiros de neve ligeiros";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
se (clouds_description == "Sunny")
{
string clouds_description_DE = "Alegre";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
se (clouds_description == "Overcast")
{
string clouds_description_DE = "Nublado";
WriteLine("clouds_description");WriteLine(clouds_description_EN);
dom.GetObject("W_description").State(clouds_description_DE);
}
se (clouds_description == "Parcialmente nublado")
{
string clouds_description_DE = "Parcialmente nublado";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
se (clouds_description == "Clear")
{
string clouds_description_DE = "Limpo";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
se (clouds_description == "Fog")
{
string clouds_description_DE = "Nevoeiro";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
se (clouds_description == "Patchy rain possible")
{
string clouds_description_EN = "Possibilidade de chuva ligeira";
WriteLine("clouds_description");WriteLine(clouds_description_EN);
dom.GetObject("W_description").State(clouds_description_DE);
}
se (clouds_description == "Chuva moderada")
{
string clouds_description_DE = "Precipitação moderada";
WriteLine("clouds_description");WriteLine(clouds_description_EN);
dom.GetObject("W_description").State(clouds_description_DE);
}


Cobertura de nuvens

Variável a ser criada:

  • W_nuvens do tipo corda

Código:

! Cobertura de nuvens

posição = 0;
posStart = 'cloudcover":';
posEnd = ', "feelslike";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string clouds_data = stdout.Substr(posValueStart, posValueEnd);
WriteLine("clouds_data");WriteLine(clouds_data);
dom.GetObject("W_clouds").State(clouds_data);


Previsão de chuva

Variável a ser criada:

  • W_Precipitação do tipo corda

Código:

! Previsão de chuva

var x;
posição = 0;
posStart = 'precip":';
posEnd = ', "humidade";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string precip = stdout.Substr(posValueStart, posValueEnd);
WriteLine("Precipitação");WriteLine(precip);
dom.GetObject("W_Precipitação").State(precip);


Elevação - Azimute

O guião foi escrito por rádio-farol e apresentado ao Fórum Homematic na página 10 do tópico ligado.

Devem ser criadas duas variáveis de sistema:

  • elevação do soln do tipo Número
  • sol_azimute do tipo Número

Porquê 4 minutos? Porque a Terra completa o seu círculo de 360° à volta do Sol uma vez em cada 24 horas. 360° / 24h = 15° por hora, o que corresponde a 60 minutos / 15° = 4 minutos.

O guião deve ser utilizado independentemente dos guiões acima referidos ou do programa associado se o intervalo de atualização for diferente de 4 minutos.

Programa:

Programa - Determinação da elevação e do azimute

Variáveis a serem criadas:

  • sol_azimute do tipo pagar
  • elevação do sol do tipo pagar

Código:

! Obter latitude
real phi = system.Latitude();
phi = 0,017453292 * phi;


! Conversão para radianos
calcular sin_phi e cos_phi com a série de taylor
real temp = phi * phi;
real sin_phi =phi * ((temp * temp * 0,0083334) +1,0 - (temp * 0,1666667));


Aproximação sinusoidal
cos_phi real = (temp *temp *0,0416667) + 1,0 - (temp * 0,5);


! aproximação do cosseno
! Cálculo da hora solar, todos os tempos em minutos
integer time_min = system.Date("%M").ToInteger() + 60system.Date("%H").ToInteger(); integer tagesbeginn_min = system.SunriseTime("%M").ToInteger() + 60system.SunriseTime("%H").ToInteger();
integer tagesende_min = system.SunsetTime("%M").ToInteger() + 60* system.SunsetTime("%H").ToInteger();
integer sonnenzeit =time_min + 720 - 0,5 *(tagesbeginn_min +tagesende_min);
se (suntime > 1440) {suntime = suntime -1440;}
se (suntime 720) {suntime =suntime - 720; afternoon = true; }
senão {sonnenzeit =720 -sonnenzeit;}


! Cálculo sin_tau e cos_tau
real tau = 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; temp = tau * tau; real cos_tau =tau * ((temp * temp * 0.0083334) +1.0 - (temp * 0.1666667));} else {real tau1 =3.141592654 - tau; temp = tau1 * tau1; real sin_tau =tau1 * ((temp * temp * 0.0083334) +1.0 - (temp * 0.1666667)); tau = tau - 1.570796327; temp = tau * tau; real cos_tau = (tau) (-1.0) ((temp * temp * 0.0083334) +1.0 - (temp * 0.1666667));}

! Cálculo delta
integer tageszahl = system.Date("%j").ToInteger(); tageszahl = tageszahl +10; if (tageszahl > 365) {tageszahl = tageszahl - 365;}
se (tageszahl 91) && (tageszahl 183) && (número de dias 274) && (tageszahl < 366)) {tageszahl = 365 - tageszahl; real tag = 0,0172142 *tageszahl; temp = tag * tag; real delta = (-0,410152) *((temp *temp *0,041666) + 1,0 - (temp * 0,5));}

! cálculo sin_delta, cos_delta
temp = delta * delta; real sin_delta =delta * ((temp * temp * 0,0083334) +1,0 - (temp * 0,1666667)); !aproximação senoidal real cos_delta = (temp *temp *0,0416667) + 1,0 - (temp * 0,5);

! aproximação do cosseno
! Cálculo tan_delta com linearização por partes da função tan
boolean vsign = true; if (delta=0.2618) {tan_delta = (1.1822*delta) - 0.0416;}
se (vsign == false) {tan_delta = (-1,0) * tan_delta;}


! Cálculo de sin_elevação e tan_azimute
real sin_elevation = (sin_phi * sin_delta) +( cos_phi * cos_delta * cos_tau);
temp = sin_elevação * sin_elevação;
real sun_elevation = sin_elevation * (1.0 + (0.1666667 * temp) + (0.075 * temp * temp));
elevação_do_sol = 57,29577951 * elevação_do-sol;
denominador real = (sin_phi*cos_tau) - (cos_phi * tan_delta);
if (denominador < 0,0) {boolean plus180 = true;} real tan_azimut = sin_tau / denominador;


! Cálculo de sun_azimuth com linearização por partes do arctan
boolean sign = true; if (tan_azimut =0,2679)&&(tan_azimut = 0.5774)&&(tan_azimut = 1.0)&&(tan_azimuth = 1.3032)&&(tan_azimuth = 1,7321)&&(tan_azimut = 2,4142)&&(tan_azimut = 2,9459)&&(tan_azimuth = 3,7321)&&(tan_azimuth = 5.0)&&(tan_azimuth = 7.0)&&(tan_azimuth = 12.0)&&(tan_azimuth = 20.0)&&(tan_azimuth = 50.0) {sonne_azimuth = (0.000099983* tan_azimuth) + 1.54579974;}
if (sun_azimuth> 1.5707963278) {sun_azimuth = 1.5707963278;}
se (sign == false) {sun_azimuth = (-1.0) * sun_azimuth;}
sun_azimuth = 57.29577951 * sun_azimuth;
if (plus180 == true) {sonne_azimut = sonne_azimut + 180.0;}


! Guardar a correção da hora do dia e os valores nas variáveis do sistema
se (afternoon == false)
{sonne_azimut = 180.0 - sonne_azimut; sonnenzeit = 720 - sonnenzeit;}
outro
{sun_azimuth = sun_azimuth + 180.0;sun_time = 720 + sun_time;}
sun_azimuth = 0.1 ((sun_azimut10.0) .ToInteger());
elevação do sol = 0,1 ((elevação do sol10.0) .ToInteger());
dom.GetObject("sonne_elevation").State(sonne_elevation);
dom.GetObject("sonne_azimut").State(sonne_azimut);

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

pt_PTPortuguese