Страница 1 из 1

Локальный прогноз погоды

Добавлено: Пн май 29, 2017 6:17 pm
directman66
Никто ещё не писал прогнозировщик погоды на основе данных метеостанции? Давления, влажности, температуры???

Отправлено с моего Redmi Note 3 через Tapatalk

Re: Локальный прогноз погоды

Добавлено: Пн май 29, 2017 7:49 pm
eygen
По точнее идею изложи.

Re: Локальный прогноз погоды

Добавлено: Пн май 29, 2017 8:29 pm
directman66

Re: Локальный прогноз погоды

Добавлено: Пн май 29, 2017 9:35 pm
directman66
пока нагородил такой огород, собираю статистику
СпойлерПоказать
header("Content-Type: text/plain; charset=utf-8");

$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";}

sg('trand.forecast', 'ясно');

Re: Локальный прогноз погоды

Добавлено: Пн май 29, 2017 11:16 pm
C_3AXAPOB
Есть такая вещь называется предсказатель Замбретти

"Наиболее часто в бытовых приборах и метеостанциях используется алгоритм, который называется "предсказатель Zambretti". Этот алгоритм в простейшем виде использует всего три параметра: текущее атмосферное давление, тенденция изменения давления и направление ветра. Алгоритм был разработан в начале 20 века в Европе на основе большого количества эмпирических наблюдений и данных. Тем не менее, несмотря на свою "бородатость" и простоту, методика Zambretti дает правильный результат более чем в 90% случаях (у буржуев, разумеется)."

Тут подробно с реализацией на пэхапэ http://ab-log.ru/smart-house/weather-station/forecast

Re: Локальный прогноз погоды

Добавлено: Пн май 29, 2017 11:59 pm
xor
Если у вас метеостанция и вы пользуетесь программой cumulus, там есть встроенный прогноз по Замбретти. Довольно часто попадает в точку с теперешними погодами.
Я добавил передачу в Мажордомо передачу этого прогноза, доработав скрипт cumulus.php.
cumulus_my.phpПоказать

Код: Выделить всё

<?php

chdir('../');

include_once("./config.php");
include_once("./lib/loader.php");

// connecting to database
$db = new mysql(DB_HOST, '', DB_USER, DB_PASSWORD, DB_NAME);

include_once("./load_settings.php");

$res = '';

//default days to keep data
const DAYS_TO_HISTORY_KEEP = 7;

$known_fields = array(
                  'tempOutside'          => 2,
                  'relHumOutside'        => 3,
                  'dewPoint'             => 4,
                  'windLatest'           => 6,
                  'windBearing'          => 7,
                  'windavgbearing'       => 46,
                  'windAverage'          => 5,
                  'rainfallRate'         => 8,
                  'rainfallHour'         => 47,
                  'rainfall24'           => 9,
                  'pressure'             => 10,
                  'pressureRt'           => -1,
                  'pressureTrend'        => 18,
                  'windDirection'        => 11,
                  'windDirectionAverage' => 51,
                  'tempInside'           => 22,
                  'relHumInside'         => 23,
                  'updatedTime'          => 1,
                  'updatedDate'          => 0,
                  'sensorContactLost'    => 50,
                  'forecastNumber'       => 48,
                );

$data  = explode(' ', $_POST['data']);
$total = count($data);

for ($i = 0; $i < $total; $i++)
{
   $res .= 'data[' . $i . '] = ' . $data[$i] . "\n";
}

//DebMes('cumulus data: '.$res);
$obj = getObject('ws');

if (!$obj)
{
   $rec = array();
   $rec['TITLE'] = 'ws';
   $rec['ID']    = SQLInsert('objects', $rec);
   
   $obj = getObject('ws');
}

$sqlQuery = "SELECT * 
               FROM objects 
              WHERE ID = '" . $obj->id . "'";

$object_rec = SQLSelectOne($sqlQuery);

if (!$object_rec['CLASS_ID'])
{
   $class_rec = array();
   $class_rec['TITLE']       = 'WeatherStations';
   $class_rec['SUB_LIST']    = 0;
   $class_rec['PARENT_LIST'] = 0;
   $class_rec['ID']          = SQLInsert('classes', $class_rec);
   $object_rec['CLASS_ID']   = $class_rec['ID'];
   
   SQLUpdate('objects', $object_rec);
}

foreach ($known_fields as $k => $v)
{
   $sqlQuery = "SELECT * 
                  FROM properties 
                 WHERE TITLE LIKE '" . DBSafe($k) . "' 
                   AND CLASS_ID = '" . $object_rec['CLASS_ID'] . "'";
   
   $prop_rec = SQLSelectOne($sqlQuery);
   
   if (!$prop_rec['ID'])
   {
      $prop_rec['CLASS_ID']     = $object_rec['CLASS_ID'];
      $prop_rec['TITLE']        = $k;
      $prop_rec['KEEP_HISTORY'] = DAYS_TO_HISTORY_KEEP;
      $prop_rec['ID']           = SQLInsert('properties', $prop_rec);
   }
}

$res = '';

$updated = array();

$latest_update=gg('ws.updatedTimestamp');

foreach ($known_fields as $k => $v)
{
   if ($v < 0)
      continue;
   
   $res .= $k . ' = ' . $data[(int)$v] . "\n";
   $old_value = getGlobal('ws.' . $k);
   
   if ($old_value != $data[(int)$v] || ((time()-$latest_update)>30*60))
   {
      $updated[$k] = 1;
      setGlobal('ws.' . $k, $data[(int)$v]);
   }
}

if ($updated['pressure'])
{
   setGlobal('ws.pressureRt', round((((float)getGlobal('ws.pressure'))/1.33322)-0.3,1));
}
if ($updated['forecastNumber'])
{
   if(gg('ws.tempoutside')>2){
         $zumber=array(
         "Неопределенная", 
         "Отличная, ясно", 
         "Хорошая, ясно", 
         "Становление хорошей, ясной", 
         "Хорошая, но ухудшается", 
         "Хорошая, возможен ливень", 
         "Достаточно хорошая, улучшается", 
         "Достаточно хорошая, возможен ливень", 
         "Достаточно хорошая, но ожидается ливень", 
         "Ливень, но улучшается", 
         "Переменчивая, но улучшается", 
         "Достаточно хорошая, вероятны ливни", 
         "Пасмурно, но проясняется", 
         "Пасмурно, возможно улучшение", 
         "Ливни, возможны временные прояснения", 
         "Ливни, становится менее устойчивой", 
         "Переменчивая, небольшие дожди", 
         "Пасмурная, короткие прояснения", 
         "Пасмурная, ожидаются дожди", 
         "Пасмурная, временами дожди", 
         "Преимущественно очень пасмурная", 
         "Временами дожди, ухудшение", 
         "Временами дожди, очень плохая, пасмурно", 
         "Дожди очень часто", 
         "Дожди, очень плохая, пасмурно", 
         "Штормовая, но улучшается", 
         "Штормовая!, дожди");
   }else{
         $zumber=array(
         "Неопределенная",
         "Отличная, ясно", 
         "Хорошая, ясно", 
         "Становление хорошей, ясной", 
         "Хорошая, но ухудшается", 
         "Хорошая, возможен снегопад", 
         "Достаточно хорошая, улучшается", 
         "Достаточно хорошая, возможен снегопад", 
         "Достаточно хорошая, но ожидается снегопад", 
         "Снегопад, но улучшается", 
         "Переменчивая, но улучшается", 
         "Достаточно хорошая, вероятен снегопад", 
         "Пасмурно, но проясняется", 
         "Пасмурно, возможно улучшение", 
         "Снегопады, возможны временные прояснения", 
         "Снегопады, становится менее устойчивой", 
         "Переменчивая, небольшой снег", 
         "Пасмурная, короткие прояснения", 
         "Пасмурная, ожидается снег", 
         "Пасмурная, временами снег", 
         "Преимущественно очень пасмурная", 
         "Временами снег, ухудшение", 
         "Временами снег, очень плохая, пасмурно", 
         "Снег очень часто", 
         "Снег, очень плохая, пасмурно", 
         "Штормовая, но улучшается", 
         "Штормовая!, снегопад");
   }
    setGlobal('ws.forecast', $zumber[gg('ws.forecastNumber')]);
}
echo "OK";

$db->Disconnect(); // closing database connection  

Re: Локальный прогноз погоды

Добавлено: Вт май 30, 2017 10:09 am
lanket
Немного о прогнозах в целом.

Так как я увлекаюсь ветрозависимым видом спорта я про прогноз погоды знаю достаточно много. Особенно про капризный ветер.

Бородатый и проверенный способ по Замбретти это хорошо в среднестатистической массе. Тобиш если вы там.

Утрирываю:
В горах прогноз смотреть бесполезно, там погода может меняться радикально каждые 4 часа.
Если вы в городе поведение погоды будет сильно отличаться от поведения в сельской местности. За счёт выделения тепла транспортом и прогретым асфальтом. Те-же многоэтажном застройки образующие тоннели сильно меняют микроклимат.
Прогноз в сельской местности на возвышенности будет отличаться от сельской на впадене хоть и расстояние между ними к примеру 100 км.

К чему это я?

Заибретти удобно за не именем альтернативы и отсутствием отягчающих обстоятельств в виде близости гор, города, впадины или возвышенности, большого озера, море океана. Ну и если интернета нету.

Я бы порекомендовал пользоваться лучше проффесиональным прогнозом. Так как они просчитываются более сложными алгоритмами разработанными институтами на основе движения воздушных масс не только на поверхности. Давления и влажности не только в одной точке. Кстати у этих алгоритмов есть один громкоговорящий параметр как площадь обрабатываем ой информации для прогноза для данной точки. Тоесть профессиональный прогноз рассчитывается на основе замеров большой площади а не одной точки.

Существует на данный момент 3 признанных и используемых в крупных метеокомпаниях алгоритма вычисления прогноза погоды. И смысл менять что то более проффесиональное на упрощенное не вижу.


По своему опыту ловца ветра могу сказать что прогноз на 3 день уже 70% вероятности, на неделю 40%. Цифры приведены интуитивно.

Для более любопытных посмотрите и побалуйтесь сервисом узконаправленным и более проффесьным в области погоды. Там же есть и api, там можно настроить точку прогноза погоды в любом месте мира, хоть во дворе своего дома. Для более точного прогноза там ещё можно вносить корректировочные данные. Обычно это отягчающие обстоятельства описанные мною выше. Заметьте прогноза погоды более недели там нет, так как это бессмысленно.

Ни разу не реклама :

http://www.windguru.cz

Маленькое но:
Бесплатно там прогноз с трехдевней задержкой. Но даже с такой задержкой он точнее всяких альтернатив.

Отправлено с моего Redmi Note 3 через Tapatalk