Оглавление
Обновлено - 20 января 2023 г.
Запись данных о погоде с помощью SmartHome и их визуализация на мобильном телефоне или планшете через AIO Creator, как правило, не являются необходимостью, но их приятно иметь.
Погодный онлайн-сервис weatherstack.com предлагает до 250 запросов в месяц - бесплатно в ограниченном объеме. Если вам действительно нужны актуальные данные о погоде, выбирайте стандартный пакет. 50 000 запросов с интервалом в минуту.
Другие доступные пакеты отличаются, прежде всего, количеством запросов и прогнозом погоды на 7 или 14 дней.
Во все пакеты включены следующие данные:
- Географическая долгота и широта
- Расположение
- Регион
- Страна
- Часовой пояс
- Местное время и дата
- Смещение UTC
- Текущее время сбора данных
- Температура воздуха
- Описание погоды
- Скорость ветра
- Направление ветра численное / географическое
- Давление воздуха
- Дождь
- Влажность
- Плотность облаков
- Температура охлаждения
- УФ-индекс
- Посмотреть
Для регистрации, независимо от пакета, требуется обычная информация и платежные реквизиты. Годовая подписка, в отличие от месячной, предоставляется со скидкой 20%.
После успешного завершения этой процедуры вы получаете так называемый API-код (Application Programming Interface), который вы копируете в url запроса. В ответ вы получите XML-файл, содержащий вышеупомянутые категории данных и значения. Данные извлекаются с помощью соответствующих скриптов и сохраняются в переменных. Затем они могут быть использованы для визуализации в AIO Creator.
Подробное описание всех возможных параметров в XML-выводе, а также дополнительных опций запроса, включенных в более дорогие пакеты, включая различные примеры кода, здесь доступный для просмотра.
Программа
Программа довольно обширна из-за большого количества данных. Поэтому отдельные разделы перечислены здесь последовательно. Все фрагменты кода в конечном итоге могут быть объединены в одну программу.
Помимо вышеперечисленных данных, в программе рассчитываются и предоставляются для визуализации дополнительные данные:
- Высота и азимут солнца
- Рекомендация по коэффициенту защиты от света

Заголовок программы
Заголовок содержит только 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_deltatemp = 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 с кусочной линеаризацией tanboolean 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);