Wiele osób zapewne się zastanawia, po co przesyłać dane na własną stronę, jeżeli można przesyłać je do serwisu pogodowego? Odpowiedź jest prosta. Takie dane mogą służyć jako np. archiwum naszych pomiarów. Nie wszystkie stacje, które wysyłają dane do Internetu, mają możliwość archiwizacji pomiarów w pamięci wewnętrznej stacji albo w pamięci zewnętrznej (np. na kartach pamięci). W serwisach pogodowych, nie zawsze jest też możliwość pobrania naszych danych, albo taka możliwość jest ograniczona czasowo, np. do ostatnich kilku miesięcy.
Czasami jest też tak, że są jakieś problemy z przesyłaniem i chcemy sprawdzić, jakie dane wysyła stacja, albo czy poprawnie przesyła pomiary do serwisów pogodowych. Wtedy przesłanie danych na własną stronę może pozwolić na zidentyfikowanie problemu.
Takie przesyłanie odbywa się najczęściej za pomocą protokołu Weather Underground (WU) lub Ecowitt. Protokół WU przesyła dane metodą HTTP GET, generuje to długie adresy URL, bo wszystkie informacje pogodowe są zawarte w adresie. Protokół Ecowitt wykorzystuje metodę HTTP POST, adres URL jest krótki, a dane pomiarowe nie są widoczne w odwołaniu URL.
Możliwość archiwizacji pomiarów na własnej stronie to spora zaleta i warto z niej korzystać.
Jak odebrać dane na stronie i archiwizować je w plikach tekstowych?
Jeżeli mamy dostęp do serwera lub hostingu internetowego z obsługą PHP, to możemy to w bardzo prosty sposób zrobić. Wystarczy utworzyć plik PHP np. "archiwum-stacja.php" z poniższym kodem. Kod jest bardzo prosty i uniwersalny.
<?php
define('TEST_ODCZYTU','0');
#Dane typu Ecowitt
define('PASSKEY','');
#Dane typu WU
define('ID','');
define('PASSWORD','');
if(!empty($_GET))
{
$wejscie=$_GET;
$metoda='get';
}
elseif(!empty($_POST))
{
$wejscie=$_POST;
$metoda='post';
}
if(isset($wejscie) and is_array($wejscie))
{
if(TEST_ODCZYTU==1)
{
$plik_test='test-odczytu-stacja.txt';
$test_odczytu_dane='Odebrano '.date("Y-m-d H:i:s").' od '.$_SERVER['REMOTE_ADDR']."\n\n";
$i=0;
foreach($wejscie as $klucz=>$wartosc)
{
$i++;
$test_odczytu_dane.=$i.") ".$klucz." = ".$wartosc."\n";
}
$zapis_test=file_put_contents($plik_test, $test_odczytu_dane);
exit;
}
if($metoda=='get')
{
if(empty($wejscie['ID']) or empty($wejscie['PASSWORD']))
{
exit;
}
elseif(ID<>$wejscie['ID'] or PASSWORD<>$wejscie['PASSWORD'])
{
exit;
}
}
elseif($metoda=='post')
{
if(empty($wejscie['PASSKEY']) or PASSKEY<>$wejscie['PASSKEY'])
{
exit;
}
}
$plik='dane-stacja-'.date('W').'-'.date('o').'.csv';
$plik_aktualne='dane-aktualne-stacja.txt';
if(empty($wejscie['dateutc']))
{
$wejscie['dateutc']=date("Y-m-d H:i:s");
}
$dane="'".implode("','",$wejscie)."'";
$zapis_aktualnych=file_put_contents($plik_aktualne, $dane);
if(!is_file($plik))
{
$dane_nag="'".implode("','",array_keys($wejscie))."'";
$zapis=file_put_contents($plik, $dane_nag."\n".$dane."\n");
}
else
{
$dane=file_get_contents($plik).$dane;
$zapis=file_put_contents($plik, $dane."\n");
}
if(!empty($zapis))
{
echo 'success';
}
}
?>
Na górze skryptu mamy opcje konfiguracyjne, dla danych przesyłanych protokołem Ecowitt i Weather Underground.
Jeżeli chcemy korzystać z protokołu Ecowitt wpisujemy klucz PASSKEY np.:
define('PASSKEY','4DC5CE9D892978D3AE21C73C6D9D9E2D');
Jeżeli będziemy korzystać z przesyłania WU wpisujemy ID stacji i hasło np:
define('ID','VFGASANGR9');
define('PASSWORD','cokoloka230x');
Skrypt ma możliwość testowego odbioru danych, bez sprawdzania danych uwierzytelniających (ID, PASSWORD, PASSKEY). Odebrane dane są zapisywane w pliku 'test-odczytu-stacja.txt', w każdej linii jest jeden parametr pogodowy i przyporządkowane mu dane.
Tak może wyglądać plik 'test-odczytu-stacja.txt':
Odebrano 2024-10-26 20:35:19 od ::1
1) PASSKEY = 4DC5CE9D892978D3AE21C73C6D9D9E2D
2) stationtype = GW2000A_V3.1.5.1
3) runtime = 112824
4) heap = 137368
5) dateutc = 2024-09-11 17:33:09
Testowy odbiór danych włączamy zamieniając 0 na 1 w linii:
define('TEST_ODCZYTU','1');
Jest to dobre rozwiązanie, gdy chcemy się zorientować jakie dane przesyła stacja, znaleźć ewentualne problemy, albo chcemy wpisać prawidłowe dane uwierzytelniające w skrypcie.
Po umieszczeniu pliku na serwerze, trzeba w konfiguracji stacji podać internetowy adres do naszego pliku, który będzie odbierał dane ze stacji.
Najczęściej jest to tak zrealizowane, że w osobnych polach wpisujemy nazwę domeny lub IP serwera (np. "jakas-domena.pl"), ścieżkę do pliku (np. "/archiwum-stacja.php") oraz port, na który będą przesyłane dane (np. 80). Standardowo dane są przesyłane na port 80, jeżeli podamy port 443 (bezpieczne połączenie https) to upewnijmy się, że stacja taką komunikacje obsługuje.
W niektórych stacjach podajemy pełny adres do pliku, czyli taki wpis będzie wyglądał np. tak "http://jakas-domena.pl/archiwum-stacja.php".
Z przesyłaniem wykorzystującym bezpieczne połączenie https (port 443) mogą być problemy, bo nie wszystkie stacje obsługują takie połączenia.
Wszystkie dane, które zostaną przesyłane z naszej stacji, za pomocą protokołu WU lub Ecowitt, będą automatycznie zapisywane w plikach tekstowych CSV. Jeden plik będzie zawierał pomiary z jednego tygodnia roku.
Przykładowa zawartość pliku z danymi
Pliki będą miały nazwę "dane-stacja-[tydzień roku]-[rok].csv". W pierwszym wierszu każdego pliku znajdują się nazwy przesyłanych parametrów pogodowych, kolejne dane będą zapisywane w nowej linii. Takie pliki bardzo łatwo zaimportować w arkuszu kalkulacyjnym i tam je analizować.
Dodatkowo w pliku "dane-aktualne-stacja.txt" będzie zapisywany ostatnio przesłany pomiar. Ten plik będzie można wykorzystać do generowania na własnej stronie aktualnych danych pogodowych lub zrobienia banera pogodowego.
Myślę, że warto z możliwości przesyłania pomiarów na własną stronę korzystać, tym bardziej, że dużo stacji ma możliwość przesyłania pomiarów jednocześnie do kilku serwisów pogodowych.
Autor: Parasol (Stacje-Pogody.pl)