Страница 2 из 93

Re: [Модуль] Яндекс погода

Добавлено: Пт май 04, 2018 7:28 pm
dr.pavlov.alex
Жму добавить новую запись, страница обновляется и ничего не происходит

Re: [Модуль] Яндекс погода

Добавлено: Вс май 06, 2018 8:47 pm
directman66
Еще не готов функционал с добавлением. Все в процессе. Заполняйте таблицу yaweather_cities вручную через phpmyadmin.

Re: [Модуль] Яндекс погода

Добавлено: Вт май 08, 2018 8:37 am
directman66
Небольшое обновление
СпойлерПоказать
new.png
new.png (59.47 КБ) 5441 просмотр
Допускаю, что некоторые иконки отсутствуют. Будут дополняться по мере необходимости. Если у кого-то показывает квадратик, просьба прислать адрес ссылки на картинку.

Добавил в справочник еще несколько городов. Если они не добавились, нужно установить модуль через удаление.

Re: [Модуль] Яндекс погода

Добавлено: Вт май 08, 2018 11:08 am
webms
Я мечтал о этом модуле давно), верю только прогнозу Яндексу. Спасибо за труд.
Но уже пол года как пользуюсь скриптом, очень нрав что говорит погоду как раньше по ТВ)
На улице ясно. Возможен умеренный ветер. Температура +21 градус. Тепло. Восход солнца сегодня в 04:31, закат в 20:19.

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

$city_id = 10738; //Люберцы
//ID города узнаем тут: https://yandex.ru/yaca/geo.c2n

$data_file = "https://export.yandex.ru/bar/reginfo.xml?region=$city_id.xml?".rand(); // адрес xml файла
$xml = simplexml_load_file($data_file); // раскладываем xml на массив
if ($xml === false) { // Проверить можно также !is_object( $xml ) или !$xml
    setTimeOut("restart_PogodaYandex", "runScript('PogodaYandex');", 5*60);
    if (gg("Communication.stateColor") == 'green') {
 	  registerError('Яндекс.Погода не обновляется', 'Ошибка');
    }
    return;
}

$temp = $xml -> weather -> day -> day_part -> temperature; // температура сейчас
$temp = getTempSign($temp); // Если значение температуры положительно, для наглядности добавляем "+"

// сохраняем основные параметры текущей погоды
//sg("PogodaYandex.City", $xml -> weather -> day -> title);
sg("PogodaYandex.Temp", $temp);
sg("PogodaYandex.Type", $xml -> weather -> day -> day_part -> weather_type);
sg("PogodaYandex.Pressure", $xml -> weather -> day -> day_part -> pressure);

// Влажность
sg("PogodaYandex.Humidity", $xml -> weather -> day -> day_part -> dampness);
sg("PogodaYandex.WindSpeed", $xml -> weather -> day -> day_part -> wind_speed);
sg("PogodaYandex.Image", $xml -> weather -> day -> day_part -> image);
sg("PogodaYandex.Image2", $xml -> weather -> day -> day_part -> { 'image-v3' });

// Направление ветра
sg("PogodaYandex.WindDir", $xml -> weather -> day -> day_part -> wind_direction);

// Солнце: восход/закат
sg("PogodaYandex.SunRise", $xml -> weather -> day -> sun_rise);
sg("PogodaYandex.SunSet", $xml -> weather -> day -> sunset);
$DayStart = explode(":", gg("PogodaYandex.SunRise"));
$DayEnd = explode(":", gg("PogodaYandex.SunSet"));
$h_start = (int) $DayStart[0];
$m_start = (int) $DayStart[1];
$h_end = (int) $DayEnd[0];
$m_end = (int) $DayEnd[1];

$dh = $h_end - $h_start;
$dm = $m_end - $m_start;

if ($dm < 0) {
    $dh = $dh - 1;
    $dm = $dm + 60;
}
sg("PogodaYandex.LongTag", "$dh:$dm");

// длинный текстовый прогноз погоды
$metcast = "На улице ".gg("PogodaYandex.Type").".";
// ветер
$WindSpeed = (float) gg("PogodaYandex.WindSpeed");
if ($WindSpeed < 1) {
    $metcast.= ' Ветра, скорее всего, нет.';
}
elseif($WindSpeed < 3) {
    $metcast.= ' Возможен слабый ветер.';
}
elseif($WindSpeed < 8) {
    $metcast.= ' Возможен умеренный ветер.';
}
elseif($WindSpeed < 13) {
    $metcast.= ' Возможен сильный ветер.';
}
elseif($WindSpeed < 20) {
    $metcast.= ' Возможен довольно сильный ветер.';
}
elseif($WindSpeed < 28) {
    $metcast.= ' Возможен штормовой ветер.';
} else {
    $metcast.= ' Ветер очень очень сильный, УРАГАН!. ';
}

$w = round(strip_tags(gg("PogodaYandex.Temp")));
$tempw = $w;

if ($w < "0") {
    $tempw = abs($w);
}
if ($w > "0") {
    $templus = " плюс ";
}

if ($tempw >= 11 and $tempw <= 14) {
    $tempcels = " градусов";
} else {
    while ($tempw > 9) {
        $tempw = $tempw - 10;
    }

    if ($tempw == 0 or $tempw >= 5 and $tempw <= 9) {
        $tempcels = "градусов";
    }
    if ($tempw == 1) {
        $tempcels = "градус";
    }
    if ($tempw >= 2 and $tempw <= 4) {
        $tempcels = "градуса";
    }
}
$metcast.= ' Температура '.gg("PogodaYandex.Temp").' '.$tempcels.'.';
$tm = (float) gg("PogodaYandex.Temp");
if ($tm < -40) {
    $metcast.= ' Очень очень очень холодно!.';
}
elseif($tm < -30) {
    $metcast.= ' Очень холодно, оденьтесь теплее.';
}
elseif($tm < -20) {
    $metcast.= ' Очень холодно.';
}
elseif($tm < -10) {
    $metcast.= ' Холодно.';
}
elseif($tm < -3) {
    $metcast.= ' Не особо холодно.';
}
elseif($tm < 3) {
    $metcast.= ' Значит, возможно, гололёд.';
}
elseif($tm < 10) {
    $metcast.= ' Прохладно.';
}
elseif($tm < 25) {
    $metcast.= ' Тепло.';
}
elseif($tm < 30) {
    $metcast.= ' Жарко.';
}
elseif($tm > 30) {
    $metcast.= ' Очень жарко!.';
}

$metcast.= ' Восход солнца сегодня в '.gg("PogodaYandex.SunRise").',';
$metcast.= ' закат в '.gg("PogodaYandex.SunSet").'.';
//$metcast.=' долгота дня '.getGlobal('PogodaYandex.LongTag').'.';    
sg('PogodaYandex.WeatherDnes', $metcast);

//Дата и время последнего обновления
//sg("PogodaYandex.UpdatedTime", time());
sg("PogodaYandex.update", date("d.m.Y H:i", time()));

// КОНЕЦ ОСНОВНОГО БЛОКА
// Функция - добавления "+" к положительной температуре
function getTempSign($temp) {
    $temp = (int) $temp;
    return $temp > 0 ? '+'.$temp : $temp;
}

// Функция - получить направления ветра в МАССИВ
function getWindDirectionY($wind) {
    $wind = (string) $wind;
    $wind_direction = array('s' => '&#8593; ю',
        'n' => '&#8595; с',
        'w' => '&#8594; з',
        'e' => '&#8592; в',
        'sw' => '&#8599; юз',
        'se' => '&#8598; юв',
        'nw' => '&#8600; сз',
        'ne' => '&#8601; св');

    $wind_dirtxt = array('s' => 'южный',
        'n' => 'северный',
        'w' => 'западный',
        'e' => 'восточный',
        'sw' => 'юго-западный',
        'se' => 'юго-восточный',
        'nw' => 'северо-западный',
        'ne' => 'северо-восточный');

    return array($wind_direction[$wind], $wind_dirtxt[$wind]);
}
а утром вообще вот так вывожу (другим скриптом)
На улице ясно. Возможен умеренный ветер. Температура +21°. Тепло. Вчера было на 2° прохладней.
Мб из обычного модуля сбора данных делать что то универсальное, интеллектуальное.
Например анализ погоды (у меня например утром проговаривает, и я знаю как одеваться)
Разные выводы, графики, прогнозы и тп

Если че, у меня есть идеи и знаю немного веб-дизайн, можем поработать вместе)

Re: [Модуль] Яндекс погода

Добавлено: Вт май 08, 2018 11:11 am
webms
Мы кстати тандемно уже работаем с fandaymon, скоро появится в свет крутые штучки для календаря :)

Re: [Модуль] Яндекс погода

Добавлено: Вт май 08, 2018 11:12 am
directman66
Проговаривание есть у меня, но пока привязано к OW:
СпойлерПоказать

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

//на всякий случай обновим погоду
//include_once(DIR_MODULES . 'app_openweather/app_openweather.class.php');
//$openweather = new app_openweather();
//$openweather->get_weather(gg('ow_city.id'));
//////////

$status .= "Сейчас на улице по данным метеослужб " . gg("ow_fact.weather_type") . ", ";

$w = round(gg("ow_fact.temperature"));
$status .= 'температура ' . chti($w, 'градус', 'градуса', 'градусов')  . " цельсия, ";

//Температура "По ощущениям"
//$realFellTemp = round(gg("ow_fact.realFell"));
//$realFellTemp = round(gg("ow_fact.temperature"));

if (gg('all_in_one.zaoknom_actual')=='1' && (gg('all_in_one.zaoknom2_actual')=="1"))
{$realFellTemp = round(min(gg("all_in_one.zaoknomtemp"),gg("all_in_one.zaoknom2temp")));}
else if 
(gg('all_in_one.zaoknom_actual')=='1' && (gg('all_in_one.zaoknom2_actual')=="0"))
{$realFellTemp = round(gg("all_in_one.zaoknomtemp"));} 
else if 
(gg('all_in_one.zaoknom_actual')=='0' && (gg('all_in_one.zaoknom2_actual')=="1"))
{$realFellTemp = round(gg("all_in_one.zaoknom2temp"));} 
else if 
(gg('all_in_one.zaoknom_actual')=='0' && (gg('all_in_one.zaoknom2_actual')=="0"))
{$realFellTemp = round(gg("ow_fact.realFell"));} 
else {$realFellTemp = round(gg("ow_fact.realFell"));     }





if ($w != $realFellTemp) {
    $status .= "на датчиках на балконе  " . chti($realFellTemp, 'градус', 'градуса', 'градусов')  . " цельсия, ";
}
//$w = gg("ow_fact.realFell");
$w = gg("ow_fact.temperature");
if ($w < -40) {
    $status .= 'мы морозов не боимся! ';
} elseif ($w < -30) { 
     $status .= 'одевайтесь теплее, очень холодно, ';
} elseif ($w < -20) {
    $status .= 'самое время есть мороженое, ';
} elseif ($w < -10) {
    $status .= 'холодновато, ';
} elseif ($w <- 3)  {
    $status .= 'не особо холодно, ';
} elseif ($w < 3) {
    $status .= 'значит, возможно, гололёд, ';
} elseif ($w < 10) {
    $status .= 'прохладно, ';
} elseif ($w < 22)  {
    $status .= 'тепло, ';
} elseif ($w < 30) {
    $status .= 'жарко, ';
} elseif ($w > 30) {
    $status .= 'ташкент, ';
} 




// Сравнение со вчерашним днем
$tNew = round((float) getGlobal('ow_fact.temperature'));
$tOld = round((float) getGlobal('ow_fact.tempYesterday'));
$tDelta = abs($tNew - $tOld);

if ($tNew > $tOld) {
     $status .= "теплее, чем вчера на " . chti($tDelta, 'градус', 'градуса', 'градусов') . ". ";
} elseif ($tNew < $tOld) {
     $status .= "холоднее, чем вчера на " . chti($tDelta, 'градус', 'градуса', 'градусов') . ". ";
} elseif ($tNew == $tOld) {
     $status .= "так же как и вчера. ";
}

$h = round(gg("ow_fact.humidity"));

$status .= "Относительная влажность " . chti($h, 'процент', 'процента', 'процентов') . ". ";

$pressure = (float) gg("ow_fact.pressure_mmhg");
if ($pressure < 738) {
    $status .= 'Атмосферное давление пониженное';
} elseif ($pressure > 768) {
    $status .='Атмосферное давление повышенное';
} else {
    $status .= 'Атмосферное давление в пределах нормы';
}
 $status .= " (" . chti(round($pressure), 'миллиметр', 'миллиметра', 'миллиметров') . " ртутного столба). ";

// ветер
$WindSpeed = (float) gg("ow_fact.wind_speed");
if ($WindSpeed < 1) {
    $status .= "Ветра нет";
} elseif ($WindSpeed < 2) {
    $status .= "Легкий ветер, ";
} elseif ($WindSpeed < 5) {
    $status .= "Слабый ветер";
} elseif ($WindSpeed < 8) {
    $status .= "Умеренный ветер";
} elseif ($WindSpeed < 10) {
    $status .= "Свежий ветер";
} elseif ($WindSpeed < 14) {
    $status .= "Сильный ветер";
} elseif ($WindSpeed < 17) {
    $status .= "Очень сильный ветер";
} elseif ($WindSpeed < 21) {
    $status .= "Ветер очень-очень сильный";
} elseif ($WindSpeed < 28) {
    $status .= "Шторм";
} else {
    $status .= "Ураган";
}
if ($WindSpeed >= 1) {
    $status .= " (" . chti(round($WindSpeed), 'метр', 'метра', 'метров') . " в секунду), ";
    $windDirections = array('севера', 'северо-востока', 'востока', 'юго-востока', 'юга', 'юго-запада', 'запада', 'северо-запада', 'севера');
     $degree = gg('ow_fact.wind_direction');
     $WindDir = $windDirections[round($degree / 45)];
    $status .= " дующий с " . $WindDir;
}
$status .= ". ";
// Прогноз погоды на сегодня
if (timeBetween("01:00", "10:00")) {
    $status .= "Сегодня утром ожидается ";
    $w = round(gg("ow_day0.temp_morn"));
} elseif (timeBetween("10:00", "14:00")) {
     $status .= "Сегодня днем ожидается ";
    $w = round(gg("ow_day0.temp_day"));
} elseif (timeBetween("14:00", "20:00")) {
     $status .= "Сегодня вечером ожидается ";
    $w = round(gg("ow_day0.eve"));
} else {
     $status .= "Сегодня ночью ожидается ";
    $w = round(gg("ow_day0.temp_night")); 
}

$status .= chti($w, 'градус', 'градуса', 'градусов') . " цельсия, " . gg("ow_day0.weather_type") . ". ";

// Погода на завтра
$w = round(gg("ow_day1.temperature"));
$status .= 'Завтра ожидается ' . chti($w, 'градус', 'градуса', 'градусов') . " цельсия, ";
$status .= gg("ow_day1.weather_type") . ".";
sg('forecast', $status);
say($status, 2);
Ручное добавление городов по плану. Хотя хотелось бы вести единый справочник, который бы пользователи сами наполняли и он автоматически обновлялся у всех при установке модуля или ручном обновлении. Есть мысли о реализации? В идеале тут бы както конект задействовать.

Re: [Модуль] Яндекс погода

Добавлено: Вт май 08, 2018 11:17 am
webms
Мое событие про погоду утром (пример выше)

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

$today = gg("PogodaYandex.Temp");
$yesterday = getHistoryValue("PogodaYandex.Temp", strtotime("-1 day")." ".date("H:i:s"));
$calct_temp = $today - $yesterday; //узнать разницу

if ($today < round($yesterday)) { 
 $temp = 'Вчера было на '.abs(round($calct_temp)).'° теплее'; 
} elseif ($today > $yesterday) {
 $temp = 'Вчера было на '.abs(round($calct_temp)).'° прохладней'; 
} else {
 $temp = 'Такая же как и вчера.';
}

$text = gg('PogodaYandex.WeatherDnes');
$r_array = array(" градусов", " градуса", " градус");
$rzt = explode(".", $text);
$rzt = str_replace($r_array, '°', $rzt);
$echo = $rzt[0].'. '.$rzt[1].'. '.$rzt[2].'. '.$rzt[3].'. '.$temp.'.';
//echo $echo;
say($echo, 3);
//rs('DemoSay', $echo); //Алиса говорит, но в чат не пишет.
Я имею введу чтоб не изобретать каждому велосипед, было бы круто чтоб все это в 1 модуле было.
Вывел например где нибудь
YandexPogoda('8:00') - говорит разницу в это время
YandexPogoda('7day') - показывает прогноз на 7 дней
и тп

Короче универсальность нужна)

Re: [Модуль] Яндекс погода

Добавлено: Вт май 08, 2018 11:20 am
directman66
Можно много нафантазировать ) Но времени как обычно на все не хватает.

Re: [Модуль] Яндекс погода

Добавлено: Вт май 08, 2018 11:40 am
skysilver
directman66 писал(а):
Вт май 08, 2018 8:37 am
Если у кого-то показывает квадратик, просьба прислать адрес ссылки на картинку.
Моя коллекция иконок погоды от Яндекса https://github.com/skysilver-lab/majord ... her/yandex
Еще с тех времен, когда у них было открытое апи. )

Re: [Модуль] Яндекс погода

Добавлено: Вт май 08, 2018 7:56 pm
Ivan
Уважаемый автор почему вы не используете API
https://tech.yandex.ru/weather/