#!/usr/bin/perl --
###############################################################################
# weather_pda.cgi #
###############################################################################
# Register: DAVIS Vantage Pro2 Plus #
# Open-Source Community Software for General Aviation Airshows & Fly Ins #
# Version: Weather 1.0 #
# Released: December 10, 2010 #
# Distributed by: http://www.reaa.ru #
# =========================================================================== #
# Copyright (c) 2006-2010 REAA (www.reaa.ru) - All Rights Reserved. #
# Software by: The REAA Development Team #
# with assistance from the REAA community. #
# Sponsored by: #
###############################################################################
$FilePath="../weather/downld02.txt"; # путь от скрипта к файлу downld02.txt содержащему данные по погоде
$site="http://www.uuwk.ru"; # Адрес сайта
$path_to_images="http://www.uuwk.ru/weather"; # путь к каталогу изображений графиков
$map_addr='<a href="http://maps.google.ru/?ie=UTF8&t=h&ll=55.023004,36.245527&spn=0.00861,0.018239&z=15&source=embed" style="color:#0000FF;text-align:left" target=_blank>'; # Адрес на Google map
$Altitude_correction = 0.0; # Поправка на высоту 0 метров от уровня земли, на которой установлен барометр. 11м = 1 мм.рт.ст
# Пример текста для вывода на дисплей
# Кудиново UUWK
# "Кудиново старт" - 123,8 мГц
# WGS 84 - N55°01.406 E36°14.653
# превышение + 192 м
# посадочные курсы 20/02
# телефон РП +7(926)991-5550
#
# Время UTC 2013-05-23 04:15:51
# Время Метео 2013-05-23 04:00:00
# Актуальность данных 15 минут
#
# ветер 210° 0.4 м/с порывы до 1.3 м/с
# температура 11.9°C точка росы 11.6°C
# влажность 98 %
# давление 739.6 мм.рт.ст. 986.0 гПа
# осадки 0.0 мм/ч
##############################################################
# Начало программы (выбор действия) #
##############################################################
print "Content-type: text/html\n\n";
# Получить из погодного файла самые свежие погодные данные
open(PRICE,$FilePath) || &send_error_ReadFile;
while($named=<PRICE>){
&GetSplitData;
}
close(PRICE);
# Перевод направления ветра на русские символы
#$Wind_Dir =~ s/S/Ю/g;
#$Wind_Dir =~ s/N/С/g;
#$Wind_Dir =~ s/W/З/g;
#$Wind_Dir =~ s/E/В/g;
# Перевод направления ветра в градусы
if ($Wind_Dir eq "N") {$Wind_Dir="0";}
if ($Wind_Dir eq "NNE") {$Wind_Dir="30";}
if ($Wind_Dir eq "NE") {$Wind_Dir="45";}
if ($Wind_Dir eq "ENE") {$Wind_Dir="60";}
if ($Wind_Dir eq "E") {$Wind_Dir="90";}
if ($Wind_Dir eq "ESE") {$Wind_Dir="120";}
if ($Wind_Dir eq "SE") {$Wind_Dir="135";}
if ($Wind_Dir eq "SSE") {$Wind_Dir="150";}
if ($Wind_Dir eq "S") {$Wind_Dir="180";}
if ($Wind_Dir eq "SSW") {$Wind_Dir="210";}
if ($Wind_Dir eq "SW") {$Wind_Dir="225";}
if ($Wind_Dir eq "WSW") {$Wind_Dir="240";}
if ($Wind_Dir eq "W") {$Wind_Dir="270";}
if ($Wind_Dir eq "WNW") {$Wind_Dir="300";}
if ($Wind_Dir eq "NW") {$Wind_Dir="315";}
if ($Wind_Dir eq "NNW") {$Wind_Dir="330";}
$Bar=$Bar+$Altitude_correction;
$Dew_Point_Def=$Temp_Out-$Dew_Point;
#$mBar=$Bar / 0.75006;
$mBar=$Bar * 1.3332;
$mBar = sprintf("%.1f",$mBar);
$Sky=$Dew_Point_Def/ 0.8 * 100; # Расчер высоты нижней кромки
print <<"OUT_HTML";
<html>
<head>
<title></title>
<meta content="text/html; charset=windows-1251" http-equiv=Content-Type>
<meta http-equiv="expires" content="Mon, 01 Jan 1990 00:00:00 GMT">
<meta http-equiv="content-language" content ="ru">
<meta http-equiv="Cache-Control" content="no-cache">
<meta name="description" content=" ">
<meta name="robоts" content="noindex,follow">
<meta name="keywords" content="">
</head>
<body bgcolor=#FFFFFF leftmargin=5 text=#1F15E8 topmargin=5 marginheight=0 marginwidth=0 link="#1F15A8" vlink="#1F1568">
<A HREF="$site">Кудиново UUWK</A><br>
"Кудиново старт" - 123,8 мГц<br>
WGS 84 -$map_addr N55°01.406 E36°14.653</A><br>
превышение + 192 м<br>
посадочные курсы 20/02<br>
телефон РП +7(926)991-5550<br>
OUT_HTML
#######################################################################################################################3
# Определение, свежие ли данные на метеостанции
#######################################################################################################################3
# дата в формате гг.мм.дд.чч.мм.сс
my ($c_sec, $c_min, $c_hour, $c_day, $c_month, $c_year, $c_day_name) = ( gmtime(time) )[0,1,2,3,4,5,6];
if ( $c_sec < 10 ) { $c_sec = 0 . $c_sec; }
if ( $c_min < 10 ) { $c_min = 0 . $c_min; }
if ( $c_hour < 10 ) { $c_hour = 0 . $c_hour; }
if ( $c_hour > 24 ) { $c_hour -= 12; }
if ( $c_day < 10 ) { $c_day = 0 . $c_day; }
$c_month++;
if ( $c_month < 10 ) { $c_month = 0 . $c_month; }
$c_year += 1900;
($w_day,$w_month,$w_year) =split(/\./,$date);
$w_year+=2000;
($w_hour,$w_min) =split(/\:/,$time);
$w_sec = '00';
if ( $w_hour < 10 ) { $w_hour = 0 . $w_hour; }
if ( $w_day < 10 ) { $w_day = 0 . $w_day; }
use Date::Manip;
#$W_date = '2008-09-24 09:21:29';
#$C_date = '2008-09-25 09:21:29';
$W_date = $w_year . '-' . $w_month . '-' . $w_day . ' ' . $w_hour . ':' . $w_min . ':' . $w_sec;
$C_date = $c_year . '-' . $c_month . '-' . $c_day . ' ' . $c_hour . ':' . $c_min . ':' . $c_sec;
$diff = UnixDate($C_date,'%s') - UnixDate($W_date,'%s');
$diff_min = int($diff / 60);
print "<br>";
#print $diff . ' '. $diff_min;
#print "<br>";
print "Время UTC $C_date<br>";
print "Время Метео $W_date<br>";
print "Актуальность данных $diff_min минут";
$diff_last = substr($diff_min, -1); # крайний символ
$diff_lasttwo = substr($diff_min, -2); # крайние 2 символа
if ($diff_last eq '1' && $diff_lasttwo ne '11') {print "а";}
if (($diff_last eq '2' || $diff_last eq '3' || $diff_last eq '4') && $diff_lasttwo ne '12' && $diff_lasttwo ne '13' && $diff_lasttwo ne '14' ) {print "ы";}
print "<br>";
if ($diff > 7200) {&send_error_OldData;} # Если данные устарели более чем на 2 часа, ошибка!
&send_actual_Data;
#####################################################################################################################
exit;
##############################################################
# Печать сообщения об ошибке #
##############################################################
sub send_error_OldData {
print <<"OUT_HTML";
<BR>
<BR>
<B><FONT COLOR=#A00000>Данные не актуальны!</FONT></B>
<BR>
<BR>
OUT_HTML
exit;
}
sub send_actual_Data {
print <<"OUT_HTML";
<br>
ветер <a href="$path_to_images/WindDirectionHistory.gif">$Wind_Dir°</a> <a href="$path_to_images/WindSpeedHistory.gif">$Wind_Speed</a> м/с порывы до $Hi_Speed м/с<br>
температура <a href="$path_to_images/OutsideTempHistory.gif">$Temp_Out</a>°C точка росы <a href="$path_to_images/DewPointHistory.gif">$Dew_Point</a>°C<br>
влажность <a href="$path_to_images/OutsideHumidityHistory.gif">$Out_Hum</a> %<br>
давление <a href="$path_to_images/BarometerHistory.gif">$Bar</a> мм.рт.ст. <a href="$path_to_images/BarometerHistory.gif">$mBar</a> гПа<br>
осадки <a href="$path_to_images/RainRateHistory.gif">$Rain_Rate</a> мм/ч <br>
</body></html>
OUT_HTML
exit;
}
##############################################################
# Разделение данных, полученных из файла #
##############################################################
sub GetSplitData {
for ($named) { s/^\s+//; } # Убрать все пробелы из начала строки (дата может содержать или не содержать пробелы перед знаком даты, что приводило к сбоям)
($date,$time,$Temp_Out,$Hi_Temp,$Low_Temp,$Out_Hum,$Dew_Point,$Wind_Speed,$Wind_Dir,$Wind_Run,$Hi_Speed,$Hi_Dir,$Wind_Chill,$Heat_Index,$THW_Index,$$THSW_Index,$Bar,$Rain,$Rain_Rate,$Solar_Radiation,$Solar_Energy,$Hi_Solar_Radiation,$UV_Index,$UV_Dose,$Hi_UV,$Heat_DD,$Cool_DD,$In_Temp,$In_Humidity,$In_Dew_Point,$In_Heat,$In_EMC,$In_Air_Density,$ET,$Wind_Samp,$Wind_TX,$ISS_Recept,$Arc_Int)=split(/\s+/,$named);
}
##############################################################
# Печать сообщения об ошибке #
##############################################################
sub send_error_ReadFile {
print "Данные не доступны!";
}