Перейти к содержимому

Погодные данные SmartHome

Время чтения 9 минут

Обновлено - 20 января 2023 г.

Запись данных о погоде с помощью SmartHome и их визуализация на мобильном телефоне или планшете через AIO Creator, как правило, не являются необходимостью, но их приятно иметь.

Погодный онлайн-сервис weatherstack.com предлагает до 250 запросов в месяц - бесплатно в ограниченном объеме. Если вам действительно нужны актуальные данные о погоде, выбирайте стандартный пакет. 50 000 запросов с интервалом в минуту.

Другие доступные пакеты отличаются, прежде всего, количеством запросов и прогнозом погоды на 7 или 14 дней.

Во все пакеты включены следующие данные:

  • Географическая долгота и широта
  • Расположение
  • Регион
  • Страна
  • Часовой пояс
  • Местное время и дата
  • Смещение UTC
  • Текущее время сбора данных
  • Температура воздуха
  • Описание погоды
  • Скорость ветра
  • Направление ветра численное / географическое
  • Давление воздуха
  • Дождь
  • Влажность
  • Плотность облаков
  • Температура охлаждения
  • УФ-индекс
  • Посмотреть

Для регистрации, независимо от пакета, требуется обычная информация и платежные реквизиты. Годовая подписка, в отличие от месячной, предоставляется со скидкой 20%.

После успешного завершения этой процедуры вы получаете так называемый API-код (Application Programming Interface), который вы копируете в url запроса. В ответ вы получите XML-файл, содержащий вышеупомянутые категории данных и значения. Данные извлекаются с помощью соответствующих скриптов и сохраняются в переменных. Затем они могут быть использованы для визуализации в AIO Creator.

Подробное описание всех возможных параметров в XML-выводе, а также дополнительных опций запроса, включенных в более дорогие пакеты, включая различные примеры кода, здесь доступный для просмотра.

Программа

Программа довольно обширна из-за большого количества данных. Поэтому отдельные разделы перечислены здесь последовательно. Все фрагменты кода в конечном итоге могут быть объединены в одну программу.

Помимо вышеперечисленных данных, в программе рассчитываются и предоставляются для визуализации дополнительные данные:

  • Высота и азимут солнца
  • Рекомендация по коэффициенту защиты от света
Программа - W_Data - Запрос данных о погоде

Заголовок программы

Заголовок содержит только URL, который должен быть дополнен ключом API, показанным здесь как xxx, и местоположением (в виде обычного текста или, разделенного запятой, в виде долготы и широты, обозначенных как yyy):

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

Конвертация формата времени США в формат времени DE

Поскольку в бесплатном и стандартном тарифе нет выбора языка отображения, и поэтому доступен только формат времени AM / PM, он преобразуется в 24-часовой формат.

Переменная, которую необходимо создать:

  • W_LDU типа строка

Код:

! Преобразование AM/PM - сохранение в 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 word_position = wetter_xml.Find(word);
string data = wetter_xml.Substr((word_position + word_laenge), 5);
integer word_position = data.Find(word);
data = data.Substr(0, (word_position -2));

string word = 'observation_time':"';
integer word_length = word.Length();
integer word_position = wetter_xml.Find(word);
string PM = wetter_xml.Substr((word_position + word_laenge +6), 2);
integer word_position = PM.Find(word);
PM = PM.Substr(0, (word_position -2));
WriteLine("AM/PM");WriteLine(PM);

string word = 'observation_time':"';
integer word_length = word.Length();
integer word_position = wetter_xml.Find(word);
string HH = wetter_xml.Substr((word_position + word_laenge) + 1, 1);
integer word_position = HH.Find(word);
HH = HH.Substr(0, (word_position -2));
WriteLine("HH");WriteLine(HH);

string word = 'observation_time':"';
integer word_length = word.Length();
integer word_position = wetter_xml.Find(word);
string MM = wetter_xml.Substr((word_position + word_laenge) +3, 2);
integer word_position = MM.Find(word);
MM = MM.Substr(0, (word_position -2));
WriteLine("MM");WriteLine(MM);

if (PM == "PM")
{
целое число Diff = 12;
WriteLine("Diff");WriteLine(Diff);
var HH_i = HH.ToInteger();
целое число H = (HH_i + Diff);
WriteLine("HHi + Diff is = H)");WriteLine(H);
string HHMM = H #":";
WriteLine("H_+ : ");WriteLine(HHMM);
строка HM = HHMM # MM;
WriteLine("HH_+12+MM");WriteLine(HM);
dom.GetObject("W_LDU").State(HM);
}
else
{
WriteLine("LDU_daten");WriteLine(daten);
dom.GetObject("W_LDU").State(data);
}


Страна - код страны

Код страны также выводится на английском языке и преобразуется в международный код здесь. При необходимости можно добавить другие страны по этому шаблону. Текущая страна автоматически определяется по городу, выбранному Weatherstack.

Переменная, которую необходимо создать:

W_country_code типа строка

Код:

! Код страны

pos = 0;
posStart = 'страна':';
posEnd = '", "region";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string country_code = stdout.Substr(posValueStart, posValueEnd);

если (код_страны == "Германия")
{
string country_code = "DE";
}
если (код_страны == "Швеция")
{
string country_code = "SE";
}

WriteLine("код_страны");WriteLine(код_страны);
dom.GetObject("W_country_code").State(country_code);


Регион

Регион обозначает, например, "Нижнюю Саксонию" в Германии и также определяется Weatherstack автоматически.

Переменная, которую необходимо создать:

  • W_регион типа строка

Код:

! Регион

pos = 0;
posStart = 'region':';
posEnd = '", "lat";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string region = stdout.Substr(posValueStart, posValueEnd);
WriteLine("регион");WriteLine(регион);
dom.GetObject("W_region").State(region);


Город

При вводе города Weatherstack автоматически определяет соответствующие данные о долготе и широте, а город определяется на основе введенных геоданных.

Переменная, которую необходимо создать:

  • W_city_name типа строка

Код:

! Название города

pos = 0;
posStart = 'name':';
posEnd = '", "страна";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string city_name = stdout.Substr(posValueStart, posValueEnd);
WriteLine("название_города");WriteLine(название_города);
dom.GetObject("W_city_name").State(city_name);


Широта - геогр. Широта

Переменная, которую необходимо создать:

  • W_Lat типа строка

Код:

! Лат

pos = 0;
posStart = 'query': 'Lat';
posEnd = 'и 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);


Долгота - долгота

Переменная, которую необходимо создать:

  • W_Lon типа строка

Код:

! Лон

pos = 0;
posStart = 'и Lon';
posEnd = '", "language";
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);


Вид - видимость

Переменная, которую необходимо создать:

  • W_vis типа строка

Код:

! Видимость

pos = 0;
posStart = 'видимость':';
posEnd = ', "is_day";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string vis_daten = stdout.Substr(posValueStart, posValueEnd);
WriteLine("vis_data");WriteLine(vis_data);
dom.GetObject("W_vis").State(vis_data);


Давление воздуха и тенденция

В дополнение к полученному давлению воздуха в этом сценарии определяется тенденция давления воздуха путем сохранения измеренного значения в качестве "текущего" и предыдущего значения в качестве "старого". Оба значения сравниваются друг с другом, в результате чего получается тренд.

Переменная, которую необходимо создать:

  • W_воздушное_давление_акт типа строка
  • W_воздушное_давление_старое типа строка
  • W_Air pressure trend типа строка

Код:

! Печать

var W_mb_alt;
var W_mb_akt;
pos = 0;
posStart = 'давление':';
posEnd = ', "precip";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
data = stdout.Substr(posValueStart, posValueEnd);WriteLine(data);
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);

если (W_mb_akt > W_mb_alt)
{
dom.GetObject("W_air_pressure_old").State(W_mb_akt);
dom.GetObject("W_Air pressure trend").State("S");
}

если (W_mb_akt < W_mb_alt)
{
dom.GetObject("W_air_pressure_old").State(W_mb_akt);
dom.GetObject("W_Air pressure trend").State("F");
}

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


Температура охлаждения

Охлаждение ветром зависит от скорости ветра и температуры. В водных видах спорта дополнительным фактором (который здесь не учитывается) является эффект испарительного охлаждения из-за брызг. Озноб - это воспринимаемая температура, которая в очень холодных условиях может быть в полтора раза ниже отрицательной по сравнению с фактической и быстро привести к обморожению.

Переменная, которую необходимо создать:

  • W_chill типа строка

Код:

! Охладитесь

pos = 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);


Рекомендации по защите от ультрафиолета и света

На основе УФ-индекса определяется степень воздействия ультрафиолетовых лучей и дается рекомендация по использованию необходимых светозащитных средств.

Переменная, которую необходимо создать:

  • W_UV типа строка
  • W_LSF типа строка

Код:

! УФ

pos = 0;
posStart = 'uv_index':';
posEnd = ', "видимость";
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);
data = uv_data.Substr(0, (word_position -2));
real number = data.ToInteger();
WriteLine("Ультрафиолетовое число");WriteLine(число);

string LSF = "";
if (number = "3") && (number = "6") && (number = "8") && (number = "10") {LSF = "MUST" ;}
dom.GetObject("W_LSF").State(LSF);WriteLine("LSF");WriteLine(LSF);


Скорость ветра

Переменная, которую необходимо создать:

  • W_WdSpd типа платить

Код:

! Скорость ветра

pos = 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);


Скорость ветра - Конверсии

Поскольку в разных регионах, странах и сферах применения существуют различные предпочтительные показатели скорости ветра, здесь приведен перевод из м/с в км/ч, узлы и Бофорта.

Переменная, которую необходимо создать:

  • W_Wind_kmh типа платить
  • W_Wind_knh типа платить
  • W_Wind_Bft типа платить

Код:

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);


реальный 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);

если (x < 0,30)
{
dom.GetObject("W_Wind_Bft").State(0);
}
if ((0.29 < x) && (x < 1.51))
{
dom.GetObject("W_Wind_Bft").State(1);
}
if ((1.59 < x) && (x < 3.31))
{
dom.GetObject("W_Wind_Bft").State(2);
}
if ((3.39 < x) && (x < 5.41))
{
dom.GetObject("W_Wind_Bft").State(3);
}
if ((5.49 < x) && (x < 7.91))
{
dom.GetObject("W_Wind_Bft").State(4);
}
if ((7.99 < x) && (x < 10.71))
{
dom.GetObject("W_Wind_Bft").State(5);
}
if ((10.79 < x) && (x < 13.81))
{
dom.GetObject("W_Wind_Bft").State(6);
}
if ((12.89 < x) && (x < 17.11))
{
dom.GetObject("W_Wind_Bft").State(7);
}
if ((17.19 < x) && (x < 20.71))
{
dom.GetObject("W_Wind_Bft").State(8);
}
if ((20.79 < x) && (x < 24.41))
{
dom.GetObject("W_Wind_Bft").State(9);
}
если ((24,49 < x) && (x < 28,41))
{
dom.GetObject("W_Wind_Bft").State(10);
}
если ((28,49 < x) && (x < 32,61))
{
dom.GetObject("W_Wind_Bft").State(11);
}
если (x > 32.6)
{
dom.GetObject("W_Wind_Bft").State(12);
}

Скорость ветра - риск обморожения

Все, кто путешествует в очень холодных зонах, получат предупреждение с помощью этого скрипта, если существует риск обморожения из-за скорости ветра и предполагаемой температуры на улице, если не использовать соответствующую защитную одежду.

Расчет основан на предположении, что снижение температуры кожи до -4,8 °C может произойти при воздействии на кожу в течение 30 минут или менее, что означает, что обморожение происходит у 5% людей.

Переменная, которую необходимо создать:

  • W_Ветер_опасность типа булево

Код:

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);
}
else
{
dom.GetObject("W_Wind_Danger").State(false);
}


Направление ветра (географическое)

Переменная, которую необходимо создать:

  • W_wind_dir типа строка

Код:

! Географическое направление ветра

pos = 0;
posStart = 'wind_dir':'';
posEnd = '", "давление";
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);


Направление ветра (численное)

Переменная, которую необходимо создать:

  • W_Wind_rchtg типа строка

Код:

! Направление ветра численное

pos = 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);


Облачный покров

Облачный покров также написан Weatherstack на английском языке, поэтому здесь представлен перевод на немецкий.

Переменная, которую необходимо создать:

  • W_description типа строка

Код:

! Описание облачного покрова

pos = 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);

if (clouds_description == "Cloudy")
{
string clouds_description_DE = "Облачно";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Light rain")
{
string clouds_description_DE = "Легкий дождь";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Light rain shower")
{
string clouds_description_EN = "Небольшие дождевые ливни";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Легкий моросящий дождь")
{
string clouds_description_DE = "Морось";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Mis")
{
string clouds_description_DE = "дымка";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Light snow showers")
{
string clouds_description_EN = "Легкие снежные дожди";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Sunny")
{
string clouds_description_DE = "Веселый";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Overcast")
{
string clouds_description_DE = "Пасмурно";
WriteLine("clouds_description");WriteLine(clouds_description_EN);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Partly cloudy")
{
string clouds_description_DE = "Частично облачно";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Clear")
{
string clouds_description_DE = "Чисто";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Туман")
{
string clouds_description_DE = "Туман";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
если (облака_описание == "Возможен мелкий дождь")
{
string clouds_description_EN = "Возможен небольшой дождь";
WriteLine("clouds_description");WriteLine(clouds_description_EN);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Умеренный дождь")
{
string clouds_description_DE = "Умеренные осадки";
WriteLine("clouds_description");WriteLine(clouds_description_EN);
dom.GetObject("W_description").State(clouds_description_DE);
}


Облачный покров

Переменная, которую необходимо создать:

  • W_clouds типа строка

Код:

! Облачный покров

pos = 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);


Прогноз дождя

Переменная, которую необходимо создать:

  • W_Precipitation типа строка

Код:

! Прогнозируемый дождь

var x;
pos = 0;
posStart = 'precip':';
posEnd = ', "влажность";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string precip = stdout.Substr(posValueStart, posValueEnd);
WriteLine("Осадки");WriteLine(precip);
dom.GetObject("W_Precipitation").State(precip);


Высота - Азимут

Сценарий был написан радиомаяк и представлено в Форум Homematic на странице 10 в этой теме.

Необходимо создать две системные переменные:

  • sun_elevation типа Номер
  • солнечный_азимут типа Номер

Почему именно 4 минуты? Потому что Земля совершает 360-градусный круг вокруг Солнца раз в 24 часа. 360° / 24h = 15° в час, что соответствует 60 минутам / 15° = 4 минуты.

Этот скрипт следует использовать независимо от вышеупомянутых скриптов или связанной с ними программы, если интервал обновления отличается от 4 минут.

Программа:

Программа - Определение высоты/азимута

Переменные, которые необходимо создать:

  • солнечный_азимут типа платить
  • высота солнца типа платить

Код:

! Получить широту
real phi = system.Latitude();
phi = 0.017453292 * phi;


! Преобразование в радианы
Вычислите sin_phi и cos_phi с помощью ряда Тейлора
real temp = phi * phi;
real sin_phi =phi * ((temp * temp * 0.0083334) +1.0 - (temp * 0.1666667));


! Синусоидальная аппроксимация
real cos_phi = (temp *temp *0.0416667) + 1.0 - (temp * 0.5);


! косинусная аппроксимация
! Расчет солнечного времени, все время в минутах
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);
if (suntime > 1440) {suntime = suntime -1440;}
if (suntime 720) {suntime =suntime - 720; afternoon = true; }
else {sonnenzeit =720 -sonnenzeit;}


! Вычисление sin_tau и cos_tau
реальное tau = 0.00436332313 * солнечное время; ! 15/60 * pi /180 * солнечное время [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));}

! Расчет дельты
integer tageszahl = system.Date("%j").ToInteger(); tageszahl = tageszahl +10; if (tageszahl > 365) {tageszahl = tageszahl - 365;}
if (tageszahl 91) && (tageszahl 183) && (number of days 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));}

! расчет sin_delta, cos_delta
temp = delta * delta; real sin_delta =delta * ((temp * temp * 0.0083334) +1.0 - (temp * 0.1666667)); !sine-approximation real cos_delta = (temp *temp *0.0416667) + 1.0 - (temp * 0.5);

! косинусная аппроксимация
! Вычисление tan_delta с кусочной линеаризацией tan
boolean vsign = true; if (delta=0.2618) {tan_delta = (1.1822*delta) - 0.0416;}
if (vsign == false) {tan_delta = (-1.0) * tan_delta;}


! Вычисление sin_elevation и tan_azimuth
Величина sin_elevation = (sin_phi * sin_delta) +( cos_phi * cos_delta * cos_tau);
temp = sin_elevation * sin_elevation;
real sun_elevation = sin_elevation * (1.0 + (0.1666667 * temp) + (0.075 * temp * temp));
sun_elevation = 57.29577951 * sun_elevation;
Вещественный знаменатель = (sin_phi*cos_tau) - (cos_phi * tan_delta);
if (denominator < 0.0) {boolean plus180 = true;} real tan_azimut = sin_tau / denominator;


! Вычисление солнечного_азимута с помощью кусочной линеаризации арктана
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;}
если (sun_azimuth> 1.5707963278) {sun_azimuth = 1.5707963278;}
if (sign == false) {sun_azimuth = (-1.0) * sun_azimuth;}
sun_azimuth = 57.29577951 * sun_azimuth;
if (plus180 == true) {sonne_azimut = sonne_azimut + 180.0;}


! Сохраните коррекцию времени суток и значения в системных переменных
if (afternoon == false)
{sonne_azimut = 180.0 - sonne_azimut; sonnenzeit = 720 - sonnenzeit;}
else
{sun_azimuth = sun_azimuth + 180.0;sun_time = 720 + sun_time;}
азимут солнца = 0.1 ((sun_azimut10.0) .ToInteger());
sun_elevation = 0.1 ((sun_elevation10.0) .ToInteger());
dom.GetObject("sonne_elevation").State(sonne_elevation);
dom.GetObject("sonne_azimut").State(sonne_azimut);

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *