[Модуль] Погода Яндекс (yandexweather)

Разработка дополнительных модулей, подключение различных приложений.

Модератор: immortal

dr.pavlov.alex
Сообщения: 103
Зарегистрирован: Вс апр 23, 2017 7:09 pm
Благодарил (а): 38 раз
Поблагодарили: 1 раз

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

Сообщение dr.pavlov.alex » Пт май 04, 2018 7:28 pm

Жму добавить новую запись, страница обновляется и ничего не происходит
Aopen de7000 на Ubuntu 16.04.4 LTS+Broadlink
directman66
Сообщения: 2801
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 380 раз
Поблагодарили: 693 раза
Контактная информация:

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

Сообщение directman66 » Вс май 06, 2018 8:47 pm

Еще не готов функционал с добавлением. Все в процессе. Заполняйте таблицу yaweather_cities вручную через phpmyadmin.
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram
directman66
Сообщения: 2801
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 380 раз
Поблагодарили: 693 раза
Контактная информация:

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

Сообщение directman66 » Вт май 08, 2018 8:37 am

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

Добавил в справочник еще несколько городов. Если они не добавились, нужно установить модуль через удаление.
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram
Аватара пользователя
webms
Сообщения: 498
Зарегистрирован: Чт дек 15, 2016 3:13 am
Благодарил (а): 221 раз
Поблагодарили: 88 раз

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

Сообщение webms » Вт май 08, 2018 11:08 am

Я мечтал о этом модуле давно), верю только прогнозу Яндексу. Спасибо за труд.
Но уже пол года как пользуюсь скриптом, очень нрав что говорит погоду как раньше по ТВ)
На улице ясно. Возможен умеренный ветер. Температура +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° прохладней.
Мб из обычного модуля сбора данных делать что то универсальное, интеллектуальное.
Например анализ погоды (у меня например утром проговаривает, и я знаю как одеваться)
Разные выводы, графики, прогнозы и тп

Если че, у меня есть идеи и знаю немного веб-дизайн, можем поработать вместе)
Аватара пользователя
webms
Сообщения: 498
Зарегистрирован: Чт дек 15, 2016 3:13 am
Благодарил (а): 221 раз
Поблагодарили: 88 раз

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

Сообщение webms » Вт май 08, 2018 11:11 am

Мы кстати тандемно уже работаем с fandaymon, скоро появится в свет крутые штучки для календаря :)
Последний раз редактировалось webms Вт май 08, 2018 11:12 am, всего редактировалось 1 раз.
directman66
Сообщения: 2801
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 380 раз
Поблагодарили: 693 раза
Контактная информация:

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

Сообщение directman66 » Вт май 08, 2018 11:12 am

Проговаривание есть у меня, но пока привязано к 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);
Ручное добавление городов по плану. Хотя хотелось бы вести единый справочник, который бы пользователи сами наполняли и он автоматически обновлялся у всех при установке модуля или ручном обновлении. Есть мысли о реализации? В идеале тут бы както конект задействовать.
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram
Аватара пользователя
webms
Сообщения: 498
Зарегистрирован: Чт дек 15, 2016 3:13 am
Благодарил (а): 221 раз
Поблагодарили: 88 раз

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

Сообщение webms » Вт май 08, 2018 11:17 am

Мое событие про погоду утром (пример выше)

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

$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 дней
и тп

Короче универсальность нужна)
directman66
Сообщения: 2801
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 380 раз
Поблагодарили: 693 раза
Контактная информация:

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

Сообщение directman66 » Вт май 08, 2018 11:20 am

Можно много нафантазировать ) Но времени как обычно на все не хватает.
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

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

Сообщение skysilver » Вт май 08, 2018 11:40 am

directman66 писал(а):
Вт май 08, 2018 8:37 am
Если у кого-то показывает квадратик, просьба прислать адрес ссылки на картинку.
Моя коллекция иконок погоды от Яндекса https://github.com/skysilver-lab/majord ... her/yandex
Еще с тех времен, когда у них было открытое апи. )
За это сообщение автора skysilver поблагодарили (всего 2):
directman66 (Вт май 08, 2018 1:32 pm) • Samir77 (Вт май 08, 2018 1:40 pm)
Рейтинг: 2.33%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Ivan
Сообщения: 1473
Зарегистрирован: Сб окт 12, 2013 11:03 pm
Благодарил (а): 49 раз
Поблагодарили: 327 раз

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

Сообщение Ivan » Вт май 08, 2018 7:56 pm

Уважаемый автор почему вы не используете API
https://tech.yandex.ru/weather/
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
Ответить