İçeriğe geç

Hava durumu verileri SmartHome

Okuma zamanı 9 dakika

Güncellendi – 20 Ocak 2023

SmartHome ile hava durumu verilerini toplamak ve bunu AIO Creator aracılığıyla cep telefonunuzda veya tabletinizde görselleştirmek genellikle bir zorunluluk değildir, ancak buna sahip olmak güzeldir.

Çevrimiçi hava durumu hizmeti weatherstack.com ayda 250'ye kadar sorgu sunar - ücretsiz olarak sınırlıdır. Gerçekten güncel hava durumu verilerini istiyorsanız standart paketi seçmelisiniz. 50.000 sorgu dakikalık aralıklarla izin verir.

Halen mevcut olan paketler öncelikle talep sayısı ve 7 veya 14 günlük hava durumu tahminleri açısından farklılık göstermektedir.

Aşağıdaki veriler tüm paketlere dahildir:

  • Coğrafi boylam ve enlem
  • Konum
  • bölge
  • ülke
  • Saat dilimi
  • Yerel saat ve tarih
  • UTC farkı
  • Veri toplamanın mevcut zamanı
  • Hava sıcaklığı
  • Hava durumu açıklaması
  • rüzgar hızı
  • Rüzgar yönü sayısal/coğrafi
  • Hava basıncı
  • Yağmur miktarı
  • Nem
  • Bulut yoğunluğu
  • Soğutma sıcaklığı
  • UV indeksi
  • görüş

Kayıt, pakete bakılmaksızın, olağan ayrıntıları ve ödeme ayrıntılarını gerektirir. Aylık yerine yıllık abonelikte 20% indirim uygulanır.

Bu prosedürü başarıyla tamamladıktan sonra, sorgu URL'sine kopyalayacağınız API kodunu (Uygulama Programlama Arayüzü) alacaksınız. Yanıt, yukarıdaki veri kategorilerini ve değerlerini içeren bir XML çıktısıdır. Veriler uygun komut dosyaları kullanılarak çıkarılır ve değişkenlerde saklanır. Bunlar daha sonra AIO Creator'da görselleştirme için kullanılabilir.

XML çıktısında mümkün olan tüm parametrelerin ayrıntılı açıklaması ve çeşitli kod örnekleri de dahil olmak üzere daha yüksek fiyatlı paketlerde yer alan isteğe bağlı sorgu seçenekleri, Burada görünür.

programı

Program, büyük miktarda veri nedeniyle oldukça kapsamlıdır. Bu nedenle burada ayrı ayrı bölümler sırayla listelenmiştir. Tüm kod parçacıkları sonuçta tek bir programda birleştirilebilir.

Yukarıda belirtilen verilere ek olarak programda ek veriler hesaplanır ve görselleştirmeye sunulur:

  • Güneş yüksekliği ve azimut
  • Güneş koruma faktörü önerisi
Program – W_Data – hava durumu verileri sorgulama

Program başlığı

Başlık yalnızca, burada xxx ile gösterilen API anahtarıyla desteklenmesi gereken URL'yi ve konumu (düz metin olarak veya virgülle ayrılmış olarak, boylam ve enlem olarak yyy ile işaretlenmiş olarak) içerir:

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

US'yi DE saat formatına dönüştürme

Ücretsiz ve standart tarifede ekran dili seçeneği olmadığından sadece AM/PM saat formatı mevcut olduğundan burada 24 saate çevrilmiştir.

Oluşturulacak değişken:

  • W_LDU türün sicim

Kod:

! AM/PM dönüşümü – W_LDU'ya kaydedin

var posValueStart;
var posValueEnd;
var posBaşlangıç;
var posEnd; dize stderr; dize stdout'u;
system.Exec("wget -q -O - '"#url#"'", &stdout, &stderr);
WriteLine(stdout);
string weather_xml = stdout;

string word = 'gözlem_zamanı":"';
tamsayı kelime_uzunluğu = kelime.Length();
tamsayı word_position = weather_xml.Find(word);
dize verileri = weather_xml.Substr((kelime_konumu + kelime_uzunluğu), 5);
tamsayı kelime_konumu = veri.Find(kelime);
veri = data.Substr(0, (word_position -2));

string word = 'gözlem_zamanı":"';
tamsayı kelime_uzunluğu = kelime.Length();
tamsayı word_position = weather_xml.Find(word);
string PM = weather_xml.Substr((kelime_konumu + kelime_uzunluğu +6), 2);
tamsayı word_position = PM.Find(word);
PM = PM.Substr(0, (word_position -2));
WriteLine("AM/PM");WriteLine(PM);

string word = 'gözlem_zamanı":"';
tamsayı kelime_uzunluğu = kelime.Length();
tamsayı word_position = weather_xml.Find(word);
string HH = weather_xml.Substr((kelime_konumu + kelime_uzunluğu) + 1, 1);
tamsayı word_position = HH.Find(word);
HH = HH.Substr(0, (word_position -2));
WriteLine("HH");WriteLine(HH);

string word = 'gözlem_zamanı":"';
tamsayı kelime_uzunluğu = kelime.Length();
tamsayı word_position = weather_xml.Find(word);
string MM = weather_xml.Substr((kelime_konumu + kelime_uzunluğu) +3, 2);
tamsayı word_position = MM.Find(word);
MM = MM.Substr(0, (word_position -2));
WriteLine("MM");WriteLine(MM);

if (PM == "PM")
{
tamsayı Fark = 12;
WriteLine("Diff");WriteLine(Fark);
var HH_i = HH.ToInteger();
tamsayı H = (HH_i + Fark);
WriteLine("HHi + Fark = H'dir)");WriteLine(H);
dize HHMM = H #":";
WriteLine("H_+ : ");WriteLine(HHMM);
dize HM = HHMM # MM;
WriteLine("HH_+12+MM");WriteLine(HM);
dom.GetObject("W_LDU").State(HM);
}
başka
{
WriteLine("LDU_data");WriteLine(veri);
dom.GetObject("W_LDU").State(data);
}


Ülke – Ülke kodu

Ülke kodu da İngilizce olarak yayınlanır ve burada uluslararası koda dönüştürülür. Gerektiğinde bu kalıba göre ilave ülkeler de eklenebilir. Şehri seçtiğinizde mevcut ülke Weatherstack tarafından otomatik olarak belirlenir.

Oluşturulacak değişken:

W_country_code türün sicim

Kod:

! Ülke_kodu

konum = 0;
posStart = 'ülke":"';
posEnd = ',”bölge';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string ülke_kodu = stdout.Substr(posValueStart, posValueEnd);

if (ülke_kodu == "Almanya")
{
string ülke_kodu = "DE";
}
if (country_code == "İsveç")
{
string ülke_kodu = "SE";
}

WriteLine("ülke_kodu");WriteLine(ülke_kodu);
dom.GetObject("W_country_code").State(country_code);


bölge

Bölge, örneğin Almanya'da “Aşağı Saksonya” olarak adlandırılıyor ve Weatherstack tarafından da otomatik olarak belirleniyor.

Oluşturulacak değişken:

  • W_bölge türün sicim

Kod:

! bölge

konum = 0;
posStart = 'bölge":"';
posEnd = ',”enlem';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string bölge = stdout.Substr(posValueStart, posValueEnd);
WriteLine("bölge");WriteLine(bölge);
dom.GetObject("W_region").State(region);


Şehir

Şehre girdiğinizde, Weatherstack ilgili enlemi ve enlemi otomatik olarak belirlerken, şehir girilen coğrafi verilerden belirlenir.

Oluşturulacak değişken:

  • W_şehir_adı türün sicim

Kod:

! Şehir_adı

konum = 0;
posStart = 'ad":"';
posEnd = ',ӟlke';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string şehir_adı = stdout.Substr(posValueStart, posValueEnd);
WriteLine("şehir_adı");WriteLine(şehir_adı);
dom.GetObject("W_şehir_adı").State(şehir_adı);


Enlem – coğrafi. Genişlik

Oluşturulacak değişken:

  • W_Enlem türün sicim

Kod:

! Enlem

konum = 0;
posStart = 'query':"Lat';
posEnd = 've Boylam';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string Lat = stdout.Substr(posValueStart, posValueEnd);
WriteLine("Enlem");WriteLine(Enlem);
dom.GetObject("W_Lat").State(Lat);


Boylam – coğrafi konum. uzunluk

Oluşturulacak değişken:

  • W_Lon türün sicim

Kod:

! boylam

konum = 0;
posStart = 've Boylam';
posEnd = ',”dil';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string Lon = stdout.Substr(posValueStart, posValueEnd);
WriteLine("Boylam");WriteLine(Boylam);
dom.GetObject("W_Lon").State(Lon);


Görünürlük – görünürlük

Oluşturulacak değişken:

  • W_vis türün sicim

Kod:

! Görünürlük

konum = 0;
posStart = 'görünürlük':';
posEnd = ',"is_day';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string vis_data = stdout.Substr(posValueStart, posValueEnd);
WriteLine("vis_data");WriteLine(vis_data);
dom.GetObject("W_vis").State(vis_data);


Hava basıncı ve trend

Bu komut dosyası, sağlanan hava basıncına ek olarak, ölçülen bir değeri “geçerli” ve bir önceki değeri “eski” olarak kaydederek hava basıncı eğilimini belirler. Her ikisi de birbiriyle karşılaştırılır ve bu da trendi ortaya çıkarır.

Oluşturulacak değişken:

  • W_hava basıncı_act türün sicim
  • W_hava basıncı_old türün sicim
  • W_Barometrik basınç eğilimi türün sicim

Kod:

! Basınç

var W_mb_old;
var W_mb_akt;
konum = 0;
posStart = 'basınç':';
posEnd = ',"yağmur';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
veri = stdout.Substr(posValueStart, posValueEnd);WriteLine(data);
gerçek W_mb_akt = data.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);

if (W_mb_akt > W_mb_old)
{
dom.GetObject("W_Luftdruck_old").State(W_mb_akt);
dom.GetObject("W_Hava basıncı eğilimi").State("S");
}

if (W_mb_akt < W_mb_old)
{
dom.GetObject("W_Luftdruck_old").State(W_mb_akt);
dom.GetObject("W_Hava basıncı eğilimi").State("F");
}

if (W_mb_akt == W_mb_old)
{
dom.GetObject("W_Luftdruck_old").State(W_mb_akt);
dom.GetObject("W_Hava basıncı eğilimi").State("N");
}


Soğutma sıcaklığı

Rüzgarın soğuması rüzgar hızına ve sıcaklığa bağlıdır. Su sporlarında spreyden kaynaklanan buharlaşmalı soğutmanın etkisi de artar (ancak bu burada dikkate alınmamıştır). Üşüme, çok soğuk bir ortamda, gerçek sıcaklığa kıyasla negatif sıcaklığın bir buçuk katına kadar çıkabilen ve hızlı donmaya yol açabilen algılanan sıcaklığı ifade eder.

Oluşturulacak değişken:

  • W_chill türün sicim

Kod:

! Sakin olmak

konum = 0;
posStart = 'gibi hissettiriyor':';
posEnd = ',"uv_index';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string app_temp_data = stdout.Substr(posValueStart, posValueEnd);
WriteLine("app_temp_data");WriteLine(app_temp_data);
dom.GetObject("W_chill").State(app_temp_data);


UV ve ışıktan koruma önerisi

UV indeksine göre belirlenen UV maruziyeti, gerekirse ışıktan korunma önlemlerinin kullanılmasına yönelik bir öneriyle sonuçlanır.

Oluşturulacak değişken:

  • W_UV türün sicim
  • W_LSF türün sicim

Kod:

! UV

konum = 0;
posStart = 'uv_index":';
posEnd = ',"görünürlük";
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);
veri = uv_data.Substr(0, (word_position -2));
gerçek sayı = data.ToInteger();
WriteLine("UV numarası");WriteLine(sayı);

dize LSF = "";
if (sayı <3) {LSF = "gereksiz" ;} elseif ((sayı >= "3") && (sayı <= "5")) {LSF = "önerilen" ;} elseif ((sayı >= "6) ") && (sayı <= "7")) {LSF = "gerekli" ;} elseif ((sayı >= "8") && (sayı <= "9")) {LSF = "gerekli" ;} elseif ( sayı >= "10") {LSF = "ZORUNLU" ;}
dom.GetObject("W_LSF").State(LSF);WriteLine("LSF");WriteLine(LSF);


rüzgar hızı

Oluşturulacak değişken:

  • W_WdSpd türün sayı

Kod:

! rüzgar hızı

konum = 0;
posStart = 'rüzgar_hızı':';
posEnd = ',"wind_degree';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
var rüzgar_spd_daten = stdout.Substr(posValueStart, posValueEnd);
gerçek x = rüzgar_spd_data.ToFloat();
dom.GetObject("W_WdSpd").State(x);


Rüzgar hızı dönüşümleri

Farklı bölge, ülke ve uygulamalarda tercih edilen rüzgar hızı ölçümleri farklı olduğundan m/s'den km/saat'e, knot'a ve Beaufort'a dönüşüm aşağıda verilmiştir.

Oluşturulacak değişken:

  • W_Rüzgar_kmh türün sayı
  • W_Rüzgar_knh türün sayı
  • W_Wind_Bft türü sayı

Kod:

gerçek 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);


gerçek 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);

eğer (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);
}
if ((24,49 < x) && (x < 28,41))
{
dom.GetObject(“W_Wind_Bft”).State(10);
}
if ((28,49 < x) && (x < 32,61))
{
dom.GetObject(“W_Wind_Bft”).State(11);
}
eğer (x > 32,6)
{
dom.GetObject(“W_Wind_Bft”).State(12);
}

Rüzgar hızı – donma tehlikesi

Çok soğuk bölgelerde seyahat eden herkes, uygun koruyucu kıyafet kullanılmadığı takdirde rüzgar hızı ve algılanan dış sıcaklık nedeniyle donma riski varsa bu komut dosyasıyla uyarı alacaktır.

Hesaplama, cildin 30 dakika veya daha kısa süre maruz kalması durumunda cilt sıcaklığının -4,8 °C'ye düşmesinin beklenebileceğini ve 5%'de insanlarda donma meydana geleceğini varsaymaktadır.

Oluşturulacak değişken:

  • W_Wind_Danger türü boolean

Kod:

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)) || ((app_temp_data == -26,0) && (28 > W_wind_kmh <30,1)) || -26,8) && (32 > W_Wind_kmh <35,1)) || ((app_temp_data == -27,4) && (37 > W_Wind_kmh <40,1)) || )) || ((app_temp_data == -28,6) && (47) > W_Wind_kmh <50,1)) ||. && (57 > W_Wind_kmh <60,1)))
{
dom.GetObject("W_Wind_Danger").State(true);
}
başka
{
dom.GetObject("W_Wind_Danger").State(false);
}


Rüzgar yönü (coğrafi)

Oluşturulacak değişken:

  • W_wind_dir türün sicim

Kod:

! Rüzgar yönü coğrafi olarak

konum = 0;
posStart = 'rüzgar_dizini":"';
posEnd = '',''basınç';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string rüzgar_dir_data = stdout.Substr(posValueStart, posValueEnd);
WriteLine("W_wind_dir");WriteLine(wind_dir_daten);
dom.GetObject("W_wind_dir").State(wind_dir_daten);


Rüzgar yönü (sayısal)

Oluşturulacak değişken:

  • W_Wind_rchtg türün sicim

Kod:

! Rüzgâr yönü sayısal olarak

konum = 0;
posStart = 'rüzgar_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);


Bulut örtüsü

Bulut örtüsü de Weatherstack tarafından İngilizce olarak yazılmıştır, bu nedenle Almancaya çevirisi burada yapılmıştır.

Oluşturulacak değişken:

  • W_açıklama türün sicim

Kod:

! Bulut örtüsü açıklaması

konum = 0;
posStart = 'hava durumu_açıklamaları":["';
posEnd = '"],"rüzgar_hızı';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string cloud_description = stdout.Substr(posValueStart, posValueEnd);
WriteLine("clouds_description_TR");WriteLine(clouds_description);

if (clouds_description == "Bulutlu")
{
string cloud_description_DE = "Bulutlu";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Hafif yağmur")
{
string cloud_description_DE = "Hafif yağmur";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Hafif yağmur sağanak")
{
string cloud_description_DE = "Hafif yağmur sağanak";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Hafif çiseleyen yağmur")
{
string cloud_description_DE = "Çiseleyen yağmur";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Yanlış")
{
string cloud_description_DE = "Bulanıklık";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Hafif kar sağanak")
{
string cloud_description_DE = "Hafif kar sağanak";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Güneşli")
{
string cloud_description_DE = "Heiter";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Bulutlu")
{
string cloud_description_DE = "Bulutlu";
WriteLine("bulutların_açıklaması");WriteLine(bulutların_açıklaması_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Parçalı bulutlu")
{
string cloud_description_DE = "Parçalı bulutlu";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Temizle")
{
string cloud_description_DE = "Temizle";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Sis")
{
string cloud_description_DE = "Sis";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Yarım yamalak yağmur mümkün")
{
string cloud_description_DE = "Hafif yağmur mümkün";
WriteLine("bulutların_açıklaması");WriteLine(bulutların_açıklaması_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Orta şiddette yağmur")
{
string cloud_description_DE = "Orta şiddette yağış";
WriteLine("bulutların_açıklaması");WriteLine(bulutların_açıklaması_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}


Bulut örtüsü

Oluşturulacak değişken:

  • W_clouds türün sicim

Kod:

! Bulut örtüsü

konum = 0;
posStart = 'bulut örtüsü":';
posEnd = ',"gibi hissettiriyor';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string cloud_data = stdout.Substr(posValueStart, posValueEnd);
WriteLine("bulutlar_verileri");WriteLine(bulutlar_verileri);
dom.GetObject("W_clouds").State(clouds_data);


Yağmur tahmini

Oluşturulacak değişken:

  • W_Yağış türün sicim

Kod:

! Yağmur tahmini

varks;
konum = 0;
posStart = 'yağış':';
posEnd = ',"nem';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string precip = stdout.Substr(posValueStart, posValueEnd);
WriteLine("Yağmur");WriteLine(yağış);
dom.GetObject("W_Precipitation").State(precip);


Yükseklik – Azimut

Senaryoyu yazan: radyo deniz feneri yazılı ve Homematic Forumu Bağlantılı konunun 10. sayfasından alınmıştır.

İki sistem değişkeni oluşturulmalıdır:

  • güneş_yüksekliği n türün Sayı
  • sun_azimuth türün Sayı

Neden sadece 4 dakika? Çünkü Dünya, Güneş etrafındaki 360 derecelik dönüşünü 24 saatte bir tamamlar. 360° / 24 saat = saatte 15°, 60 dakika / 15° = 4 dakikaya karşılık gelir.

Güncelleme aralığının 4 dakikadan farklı olması koşuluyla, komut dosyası yukarıdaki komut dosyalarından veya ilgili programdan bağımsız olarak kullanılmalıdır.

Program:

Program – yükseklik/azimut belirleme

Oluşturulacak değişkenler:

  • sun_azimuth türün sayı
  • güneş_yüksekliği türün sayı

Kod:

! Enlemi edinin
gerçek phi = system.Latitude();
fi = 0,017453292 * fi;


! Radyana dönüştürme
! Taylor serisiyle sin_phi ve cos_phi'yi hesaplayın
gerçek sıcaklık = phi * phi;
gerçek sin_phi =phi * ((sıcaklık * sıcaklık * 0,0083334) +1,0 - (sıcaklık * 0,1666667));


! sinüs yaklaşımı
gerçek cos_phi = (sıcaklık *sıcaklık *0,0416667) + 1,0 - (sıcaklık * 0,5);


! kosinüs yaklaşımı
! Güneş zamanının hesaplanması, tüm zamanlar dakika cinsinden
tamsayı time_min = system.Date("%M").ToInteger() + 60system.Date("%H").ToInteger(); day_min'in tamsayı başlangıcı = system.SunriseTime("%M").ToInteger() + 60system.SunriseTime("%H").ToInteger();
day_min tamsayı sonu = system.SunsetTime("%M").ToInteger() + 60* system.SunsetTime("%H").ToInteger();
tamsayı güneş zamanı = time_min + 720 - 0,5 *(day_min başlangıcı + day_min sonu);
if (güneş zamanı > 1440) {güneş zamanı = güneş zamanı -1440;}
if (güneş zamanı < 1) {güneş zamanı = 1440 + güneş zamanı;} boolean öğleden sonra =false; if (solartime > 720) {solartime =solartime - 720; öğleden sonra = doğru; }
else {güneş zamanı =720 -güneş zamanı;}


! sin_tau ve cos_tau hesaplaması
gerçek tau = 0,00436332313 * güneş zamanı; ! 15/60 * pi /180 * güneş zamanı [0 < tau < pi ] if (tau < 1,570796327) {temp = tau * tau; gerçek sin_tau =tau * ((sıcaklık * sıcaklık * 0,0083334) +1,0 - (sıcaklık *0,1666667)); tau= 1,570796327 - tau; sıcaklık = tau * tau; gerçek cos_tau =tau * ((sıcaklık * sıcaklık * 0,0083334) +1,0 - (sıcaklık * 0,1666667));} else {gerçek tau1 =3,141592654 - tau; sıcaklık = tau1 * tau1; gerçek sin_tau =tau1 * ((sıcaklık * sıcaklık * 0,0083334) +1,0 - (sıcaklık * 0,1666667)); tau = tau - 1,570796327; sıcaklık = tau * tau; gerçek cos_tau = (tau) (-1,0) ((sıcaklık * sıcaklık * 0,0083334) +1,0 - (sıcaklık * 0,1666667));}

! Hesaplama deltası
tamsayı gün sayısı = system.Date("%j").ToInteger(); gün numarası = gün numarası +10; if (daynumber > 365) {daynumber = daynumber - 365;}
if (gün sayısı < 92) {gerçek gün = 0,0172142 * gün sayısı;temp = gün * gün; gerçek delta = (-0,410152) *((temp *temp *0,041666) + 1,0 - (temp * 0,5));} if ((gün numarası >91) && (gün numarası < 184)) {gün numarası = 183 - gün sayı; gerçek gün = 0,0172142 *gün sayısı; sıcaklık = gün * gün; gerçek delta = (0,410152) *((temp *temp *0,041666) + 1,0 - (temp * 0,5));} if ((gün numarası >183) && (gün numarası < 275)) {gün numarası = gün numarası - 183 ; gerçek gün = 0,0172142 *gün sayısı; sıcaklık = gün * gün; gerçek delta = (0,410152) *((temp *temp *0,041666) + 1,0 - (temp * 0,5));} if ((gün numarası >274) && (gün numarası < 366)) {gün numarası = 365 - gün numarası ; gerçek gün = 0,0172142 *gün sayısı; sıcaklık = gün * gün; gerçek delta = (-0,410152) *((sıcaklık *sıcaklık *0,041666) + 1,0 - (sıcaklık * 0,5));}

! hesaplama sin_delta, cos_delta
sıcaklık = delta * delta; gerçek sin_delta =delta * ((sıcaklık * sıcaklık * 0,0083334) +1,0 - (sıcaklık * 0,1666667)); !sinüs yaklaşımı gerçek cos_delta = (temp *temp *0,0416667) + 1,0 - (temp * 0,5);

! kosinüs yaklaşımı
! Tan'ın parçalı doğrusallaştırılmasıyla tan_delta'nın hesaplanması
boolean vssign = doğru; if (delta< 0.0) {vsign = false; delta = (-1,0) *delta;} gerçek tan_delta = 1,0233 * delta; if (delta >=0,2618) {tan_delta = (1,1822*delta) - 0,0416;}
if (vsign == false) {tan_delta = (-1.0) * tan_delta;}


! Sin_elevation ve tan_azimuth'un hesaplanması
gerçek günah_yüksekliği = (sin_phi * sin_delta) +( cos_phi * cos_delta * cos_tau);
temp = sin_elevation * sin_elevation;
gerçek güneş_yüksekliği = günah_yüksekliği * (1,0 + (0,1666667 * sıcaklık) + (0,075 * sıcaklık * sıcaklık));
sun_elevation = 57,29577951 * sun_elevation;
gerçek payda = (sin_phi*cos_tau) - (cos_phi * tan_delta);
if (payda < 0,0) {boolean plus180 = true;} real tan_azimuth = sin_tau / payda;


! Arktanın parçalı doğrusallaştırılmasıyla sun_azimut'un hesaplanması
boole işareti = doğru; if (tan_azimuth < 0,0) { işaret = yanlış; tan_azimuth = (-1,0)*tan_azimuth;} gerçek 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_azimuth) + 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,123* tan_azimuth) + 0,88115;} if ((tan_azimuth >= 2,9459)&(tan_azimuth < 3,73) 21)) {sun_azimuth = (0,083312* tan_azimuth) + 0,9981;} if ((tan_azimuth >= 3,7321)&&(tan_azimuth < 5,0)) {sun_azimuth = (0,050792* tan_azimuth) + 1,1194;} if ((tan_azimuth >= 5,0)&&(tan_azimuth <7,0)) {sun_azimuth = (0,02775* tan_azimuth) + 1,23465;} if ((tan_azimuth >= 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;} if (( 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;}
if (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) {sun_azimuth = sun_azimuth + 180.0;}


! Günlük düzeltme ve değerleri sistem değişkenlerine kaydetme
if (öğleden sonra == false)
{sun_azimuth = 180,0 - sun_azimuth; güneş zamanı = 720 - güneş zamanı;}
başka
{sun_azimuth = sun_azimuth + 180.0;güneş zamanı = 720 + güneş zamanı;}
güneş_azimut = 0,1 ((sun_azimuth10.0) .ToInteger());
güneş_yüksekliği = 0,1 ((sun_elevation10.0) .ToInteger());
dom.GetObject("sonne_elevation").State(sonne_elevation);
dom.GetObject("sun_azimuth").State(sun_azimuth);

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

tr_TRTürkçe