header("Content-Type: text/plain; charset=utf-8");
//$z_where Северное = 1 (это наше, если что) или Южное = 2 полушарие
//$z_baro_top верхний предел 'погодного окна' (1050.0 гПа для Великобритании)
//$z_baro_bottom нижний предел 'погодного окна' (950.0 гПа для Великобритании)
// usage: forecast = betel_cast( $z_hpa, $z_month, $z_wind, $z_trend [, $z_where] [, $z_baro_top] [, $z_baro_bottom]);
// $z_hpa - Атмосферное давление в гПа
// $z_month текущий месяц, от 1 до 12
// $z_wind текущее направление ветра в английской системе координат типа N, NNW, NW и т.д.
// $z_trend изменения в атмосферном давлении: 0 = не меняется, 1 = растет, 2 = снижается
function betel_cast( $z_hpa, $z_month, $z_wind, $z_trend, $z_where = 1, $z_baro_top , $z_baro_bottom , $wh_temp_out )
{
// Если зима, то снег, а не дожди!
if ( $wh_temp_out < 2 )
$z_forecast = Array("отличная, ясно", "хорошая, ясно",
"становление хорошей, ясной", "хорошая, но ухудшается",
"хорошая, возможен снегопад", "достаточно хорошая, улучшается",
"достаточно хорошая, возможен снегопад",
"достаточно хорошая, но ожидается снегопад",
"снегопад, но улучшается", "переменчивая, но улучшается",
"достаточно хорошая, вероятен снегопад", "пасмурно, но проясняется",
"пасмурно, возможно, улучшение",
"снегопады, возможны временные прояснения",
"снегопады, становится менее устойчивой",
"переменчивая, небольшой снег", "пасмурная, короткие прояснения",
"пасмурная, ожидается снег", "пасмурная, временами снег",
"преимущественно, очень пасмурная", "временами снег, ухудшение",
"временами снег, очень плохая, пасмурно", "снег очень часто",
"снег, очень плохая, пасмурно", "штормовая, но улучшается",
"штормовая!, снегопад");
else
$z_forecast = Array("отличная, ясно", "хорошая, ясно",
"становление хорошей, ясной", "хорошая, но ухудшается",
"хорошая, возможен ливень", "достаточно хорошая, улучшается",
"достаточно хорошая, возможен ливень",
"достаточно хорошая, но ожидается ливень", "ливень, но улучшается",
"переменчивая, но улучшается", "достаточно хорошая, вероятны ливни",
"пасмурно, но проясняется", "пасмурно, возможно, улучшение",
"ливни, возможны временные прояснения",
"ливни, становится менее устойчивой",
"переменчивая, небольшие дожди", "пасмурная, короткие прояснения",
"пасмурная, ожидаются дожди", "пасмурная, временами дожди",
"преимущественно, очень пасмурная", "временами дожди, ухудшение",
"временами дожди, очень плохая, пасмурно", "дожди очень часто",
"дожди, очень плохая, пасмурно", "штормовая, но улучшается",
"штормовая!, дожди");
// equivalents of Zambretti 'dial window' letters A - Z
$rise_options = Array(25,25,25,24,24,19,16,12,11,9,8,6,5,2,1,1,0,0,0,0,0,0) ;
$steady_options = Array(25,25,25,25,25,25,23,23,22,18,15,13,10,4,1,1,0,0,0,0,0,0) ;
$fall_options = Array(25,25,25,25,25,25,25,25,23,23,21,20,17,14,7,3,1,1,1,0,0,0) ;
$z_range = $z_baro_top - $z_baro_bottom;
$z_constant = round(($z_range / 22), 3);
$z_season = (($z_month >= 4) && ($z_month <= 9)) ;
echo '$z_season:'.$z_season,PHP_EOL;
echo '$z_where:'.$z_where,PHP_EOL;
echo '$z_wind:'.$z_wind,PHP_EOL;
echo '$z_hpa:'.$z_hpa,PHP_EOL;
echo "z_baro_top=".$z_baro_top ."\n\r";
echo "z_baro_bottom=".$z_baro_bottom ."\n\r";
echo "z_range=".$z_range ."\n\r";
// true if 'Summer'
//$z_range - это коридор
if ($z_where == 1) { // северное полушарие
echo "Северное полушарие\n\r";
if ($z_wind == "N") {
$z_hpa += 6 / 100 * $z_range ;
} else if ($z_wind == "NNE") {
$z_hpa += 5 / 100 * $z_range ;
} else if ($z_wind == "NE") {
$z_hpa += 5 / 100 * $z_range ;
} else if ($z_wind == "ENE") {
$z_hpa += 2 / 100 * $z_range ;
} else if ($z_wind == "E") {
$z_hpa -= 0.5 / 100 * $z_range ;
} else if ($z_wind == "ESE") {
$z_hpa -= 2 / 100 * $z_range ;
} else if ($z_wind == "SE") {
$z_hpa -= 5 / 100 * $z_range ;
} else if ($z_wind == "SSE") {
$z_hpa -= 8.5 / 100 * $z_range ;
} else if ($z_wind == "S") {
$z_hpa -= 12 / 100 * $z_range ;
} else if ($z_wind == "SSW") {
$z_hpa -= 10 / 100 * $z_range ; //
} else if ($z_wind == "SW") {
$z_hpa -= 6 / 100 * $z_range ;
} else if ($z_wind == "WSW") {
$z_hpa -= 4.5 / 100 * $z_range ; //
} else if ($z_wind == "W") {
$z_hpa -= 3 / 100 * $z_range ;
} else if ($z_wind == "WNW") {
$z_hpa -= 0.5 / 100 * $z_range ;
}else if ($z_wind == "NW") {
$z_hpa += 1.5 / 100 * $z_range ;
} else if ($z_wind == "NNW") {
$z_hpa += 3 / 100 * $z_range ;
}
if ($z_season == TRUE) { // if Summer
if ($z_trend == 1) { // rising
$z_hpa += 7 / 100 * $z_range;
} else if ($z_trend == 2) { // falling
$z_hpa -= 7 / 100 * $z_range;
}
}
} else { // must be South hemisphere
echo "Южное полушарие\n\r";
if ($z_wind == "S") {
$z_hpa += 6 / 100 * $z_range ;
} else if ($z_wind == "SSW") {
$z_hpa += 5 / 100 * $z_range ;
} else if ($z_wind == "SW") {
$z_hpa += 5 / 100 * $z_range ;
} else if ($z_wind == "WSW") {
$z_hpa += 2 / 100 * $z_range ;
} else if ($z_wind == "W") {
$z_hpa -= 0.5 / 100 * $z_range ;
} else if ($z_wind == "WNW") {
$z_hpa -= 2 / 100 * $z_range ;
} else if ($z_wind == "NW") {
$z_hpa -= 5 / 100 * $z_range ;
} else if ($z_wind == "NNW") {
$z_hpa -= 8.5 / 100 * $z_range ;
} else if ($z_wind == "N") {
$z_hpa -= 12 / 100 * $z_range ;
} else if ($z_wind == "NNE") {
$z_hpa -= 10 / 100 * $z_range ; //
} else if ($z_wind == "NE") {
$z_hpa -= 6 / 100 * $z_range ;
} else if ($z_wind == "ENE") {
$z_hpa -= 4.5 / 100 * $z_range ; //
} else if ($z_wind == "E") {
$z_hpa -= 3 / 100 * $z_range ;
} else if ($z_wind == "ESE") {
$z_hpa -= 0.5 / 100 * $z_range ;
}else if ($z_wind == "SE") {
$z_hpa += 1.5 / 100 * $z_range ;
} else if ($z_wind == "SSE") {
$z_hpa += 3 / 100 * $z_range ;
}
if ($z_season == FALSE) { // if Winter
if ($z_trend == 1) { // rising
$z_hpa += 7 / 100 * $z_range;
} else if ($z_trend == 2) { // falling
$z_hpa -= 7 / 100 * $z_range;
}
}
} // END North / South
echo "z_hpa1=".$z_hpa."\n\r";
if($z_hpa == $z_baro_top) {$z_hpa = $z_baro_top - 1;}
$z_option = floor(($z_hpa - $z_baro_bottom) / $z_constant);
$z_option2 = (($z_hpa - $z_baro_bottom) / $z_constant);
$z_output = "";
echo "z_option=".$z_option ."\n\r";
echo "z_option2=".$z_option2 ."\n\r";
echo "z_hpa2=".$z_hpa."\n\r";
echo "z_baro_bottom=".$z_baro_bottom."\n\r";
echo "z_constant=".$z_constant."\n\r";
echo "z_option=".$z_option ."\n\r";
echo "z_range=".$z_range ."\n\r";
if($z_option < 0) {
$z_option = 0;
//$z_output = "отличная погода z_output=".$z_output.", ";
$z_output = "провосходная, ";
}
if($z_option > 21) {
$z_option = 21;
// $z_output = "Exceptional Weather z_output=".$z_output.", ";
$z_output = "провосходная, ";
}
if ($z_trend == 1) {
$z_output .= $z_forecast[$rise_options[$z_option]] ;
} else if ($z_trend == 2) {
$z_output .= $z_forecast[$fall_options[$z_option]] ;
} else {
$z_output .= $z_forecast[$steady_options[$z_option]] ;
}
return ($z_output) ;
}
/////////основной код
/////////основной код
$curtemp=gg('all_in_one.zaoknomtemp');
$curhum=gg('all_in_one.zaoknomhum');
$curpress=gg('onesensor.pressure');
//среднее значение давления за месяц
$ti= '-4 day';
//$ti= "-1 day";
$avgpress=getHistoryAvg('onesensor.pressure',strtotime($ti));
//$avgpress=getHistoryAvg('all_in_one.zaoknomtemp',strtotime($ti));
$month=date('m');
//определям времена года
$vrgoda="zima";
if ($month>='03' and $month<'06') {$vrgoda="vesna";}
if ($month>='06' and $month<'09') {$vrgoda="leto";}
if ($month>='09' and $month<'12') {$vrgoda="osen";}
// определяем трэнд давления
$press1=getHistoryAvg('onesensor.pressure', strtotime("-1 hour"));
$press2=getHistoryAvg('onesensor.pressure',"-2 hour" ,"-1 hour");
$press3=getHistoryAvg('onesensor.pressure',"-3 hour" ,"-2 hour");
$press4=getHistoryAvg('onesensor.pressure',"-4 hour" ,"-3 hour");
$delta=10;
$ca=$curpress-$avgpress;
$ac=$avgpress-$curpress;
$pressvid="среднее";
if ($ca>$delta) {$pressvid='высокое';}
if ($ac<-$delta) {$pressvid="низкое";}
echo $month,PHP_EOL;
echo '$ti:'.$ti,PHP_EOL;
echo '$vrgoda:'.$vrgoda,PHP_EOL;
echo '$curtemp:'.$curtemp,PHP_EOL;
echo '$curhum:'.$curhum,PHP_EOL;
echo '$curpress:'.$curpress,PHP_EOL;
echo '$avgpress:'.$avgpress,PHP_EOL;
echo '$press1:'.$press1,PHP_EOL;
echo '$press2:'.$press2,PHP_EOL;
echo '$press3:'.$press3,PHP_EOL;
echo '$press4:'.$press4,PHP_EOL;
echo '$ca:'.$ca,PHP_EOL;
echo '$ac:'.$ac,PHP_EOL;
echo '$pressvid:'.$pressvid,PHP_EOL;
if ($vrgoda="vesna") {echo "vesna",PHP_EOL;}
//sg('trand.forecast', 'давление '.$pressvid);
/////////////////
/////////////////
/////////////////
/////////////////
$wind_dir_text_uk = array("N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW", "FALSE");
$wind_dir_avg=$wind_dir_text_uk[round(gg("ow_fact.wind_direction") / 22.5)];
echo "wind_dir_avg:".$wind_dir_avg,PHP_EOL;
$windDirection = ['Северный', 'Северо-северо-восточный', 'Северо-восточный', 'Восточно-северо-восточный', 'Восточный', 'Восточно-юго-восточный', 'Юго-восточный', 'Юго-юго-восточный', 'Южный', 'Юго-юго-западный', 'Юго-западный', 'Западно-юго-западный', 'Западный', 'Западно-северо-западный', 'Северо-западный', 'Северо-северо-западный', 'Северный'];
$direction = $windDirection[round(gg("ow_fact.wind_direction") / 22.5)];
echo "direction:".$direction,PHP_EOL;
// Переменные $abs_pressure, $abs_pressure_1h, $wind_dir_avg, $wh_temp_out берутся из базы данных.
// Процесс заполнения базы и выборки из нее подробно рассмотрен в предыдущей статье,
// поэтому здесь опускаем эту часть кода
// Бесхитростное определение тенденции в изменении давления
// Здесь и в основной функции значения переведены из мм.рт.ст в гПа
$abs_pressure=$curpress*1.33322;
$abs_pressure_1h=$press1*1.33322;
//$wind_dir_avg='W';
$wh_temp_out=$curtemp;
if ( $abs_pressure > $abs_pressure_1h + 0.25)
{
$pressure_trend = 1;
$pressure_trend_text = "рост";
}
else if ( $abs_pressure_1h > $abs_pressure + 0.25)
{
$pressure_trend = 2;
$pressure_trend_text = "падение";
}
else
{
$pressure_trend = 0;
$pressure_trend_text = "не меняется";
}
$forecast = betel_cast($abs_pressure, date('m'), $wind_dir_text_uk[$wind_dir_avg], $pressure_trend, 1, gg("zambretty.uppress "), gg("zambretty.downpress "), $wh_temp_out);
//$forecast = betel_cast($abs_pressure, date('m'), 'S', $pressure_trend, 1, 1050, 950, $wh_temp_out);
//$forecast = betel_cast($abs_pressure, date('m'), 'W', $pressure_trend, 1, 1050, 950, '10');
echo 'Тенденция давления:'. $pressure_trend_text,PHP_EOL;
echo 'Прогноз:'.$forecast,PHP_EOL;
sg('trand.forecast', 'давление '.$pressvid .' '. $pressure_trend_text.' прогноз:'.$forecast);