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

[Сценарий] Погода от Яндекс

Добавлено: Сб мар 21, 2015 4:59 am
Amarok
Прогноз погоды с Yandex v2.1.5Показать

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

$objects=getObjectsByClass("Погода с Yandex"); //имя класса
foreach($objects as $obj) {
$city_id=gg($obj['TITLE'].".city_id"); //ID города узнаем тут: https://pogoda.yandex.ru/static/cities.xml
$data_file="http://export.yandex.ru/weather-ng/forecasts/$city_id.xml?".rand(); // адрес xml файла
$xml = simplexml_load_file($data_file); // раскладываем xml на массив

$temp_yesterday=$xml->yesterday->temperature; //узнаем вчерашнюю температуру в это же время
if ($temp_yesterday>0) {$temp_yesterday='+'.$temp_yesterday;} // Если значение температуры положительно, для наглядности добавляем "+"
sg($obj['TITLE'].".TempYesterday",$temp_yesterday);

$temp=$xml->fact->temperature;
if (date('G')==13) {sg($obj['TITLE'].".Temp13h",$temp);}
if (date('G')==21) {sg($obj['TITLE'].".Temp21h",$temp);}
if ($temp>0) {$temp='+'.$temp;} // Если значение температуры положительно, для наглядности добавляем "+"
sg($obj['TITLE'].".Temp",$temp);
sg($obj['TITLE'].".Type",$xml->fact->weather_type);
sg($obj['TITLE'].".Pressure",$xml->fact->pressure);
sg($obj['TITLE'].".Humidity",$xml->fact->humidity);
sg($obj['TITLE'].".WindSpeed",$xml->fact->wind_speed);
sg($obj['TITLE'].".Image",$xml->fact->{'image-v3'});

$rain1=gg($obj['TITLE'].".Type");
$rain2=$xml->day[0]->day_part[0]->weather_type;
$rain3=$xml->day[0]->day_part[1]->weather_type;
$rain4=$xml->day[0]->day_part[2]->weather_type;
$rain5=$xml->day[0]->day_part[3]->weather_type;
$rain=($rain1. $rain2. $rain3. $rain4. $rain5);

$pos = strpos($rain, "дожд");
if ($pos === false) {
    sg($obj['TITLE'].".Rain",0);
    } else {
    sg($obj['TITLE'].".Rain",1);
//    say("Возможен дождь",2);
    }

$dir = $xml->fact->wind_direction;
switch ($dir){
   case 's':
     $dir="южный";
     break;
   case 'n':
     $dir="северный";
     break;
   case 'w':
     $dir="западный";
     break;
   case 'e':
     $dir="восточный";
     break;
   case 'sw':
     $dir="юго-западный";
     break;
   case 'nw':
     $dir="северо-западный";
     break;
   case 'se':
     $dir="юго-восточный";
     break;
   case 'ne':
     $dir="северо-восточный";
     break;
   case 'calm':
     $dir="штиль";
     break;
}

sg($obj['TITLE'].".WindDir",$dir);
sg($obj['TITLE'].".SunRise",$xml->day[0]->sunrise);
sg($obj['TITLE'].".SunSet",$xml->day[0]->sunset);

    $metcast="На улице ".gg($obj['TITLE'].".Type").".";
    // состояние ветра, согласно Шкалы Бофорта
    $WindSpeed=(float)gg($obj['TITLE'].".WindSpeed");
    if ($WindSpeed==0) { $metcast.=' Безветренно.';
    } elseif ($WindSpeed<2) { $metcast.=' Возможен тихий ветер.';
    } elseif ($WindSpeed<3) { $metcast.=' Возможен легкий ветер.';
    } elseif ($WindSpeed<5) { $metcast.=' Возможен слабый ветер.';
    } elseif ($WindSpeed<8) { $metcast.=' Умеренный ветер.';
    } elseif ($WindSpeed<11) { $metcast.=' Свежий ветер.';
    } elseif ($WindSpeed<14) { $metcast.=' Сильный ветер.';
    } elseif ($WindSpeed<17) { $metcast.=' Крепкий ветер.';
    } elseif ($WindSpeed<20) { $metcast.=' Очень крепкий ветер. Без нужды из дома лучше не выходить.';
    } elseif ($WindSpeed<25) { $metcast.=' На улице шторм. Выходить из дома не рекомендуется.';
    } else { $metcast.=' На улице ураган. Выходить из дома не рекомендуется.';
    } 
    
$w=round(strip_tags(gg($obj['TITLE'].".Temp")));
$tempw=$w;

if($w < "0"){ $tempw=abs($w); }
if($w > "0"){ $templus=" +"; }

$tempcels="°";

    $metcast.=' Температура '.gg($obj['TITLE'].".Temp").''.$tempcels.'.';
    $tm=(float)gg($obj['TITLE'].".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($obj['TITLE'].".SunRise").',';
//    $metcast.=' закат в '.gg($obj['TITLE'].".SunSet").'.';
sg($obj['TITLE'].".metcast",$metcast);
//
 $w3days="Сегодня ночью будет ";
   $temp=$xml->day[0]->day_part[3]->temperature_from;
  if ($temp!="") {
   if ($temp>0) {$temp='+'.$temp;}
 $w3days.=$temp;
   $w3days.="°, "; }
 $w3days.=$xml->day[0]->day_part[3]->weather_type;
 $w3days.=".\r\nЗавтра днём будет ";
 $temp=$xml->day[1]->day_part[1]->temperature_from;
 if ($temp!="") {
   if ($temp>0) {$temp='+'.$temp;}
 $w3days.=$temp; 
  $w3days.="°, "; }
 $w3days.=$xml->day[1]->day_part[1]->weather_type;
 $w3days.=". Послезавтра ночью ";
  if ($temp!="") {
   $temp=$xml->day[1]->day_part[3]->temperature_from;
   if ($temp>0) {$temp='+'.$temp;}
 $w3days.=$temp;
   $w3days.="°, "; }
 $w3days.=$xml->day[1]->day_part[3]->weather_type;
 $w3days.=".";

$dir1 = $xml->fact->season;
switch ($dir1){
   case 'winter':
     $dir1="зима";
     break;
   case 'summer':
     $dir1="лето";
     break;
   case 'autumn': 
    $dir1="осень";
     break;
   case 'spring':
     $dir1="весна";
     break;
  }
sg($obj['TITLE'].".season",$dir1); //время года 
sg($obj['TITLE'].".forecast",$w3days);
sg($obj['TITLE'].".updated" , date("H:i",time()));}
say("Читаю прогноз погоды с Yandex", 0);
Использование:
  • создать класс Погода с Yandex
  • создать свойство класса city_id (это ID города согласно Yandex)
  • создать свойство класса city (это имя города по русски)
  • создать свойство класса Temp и установить желаемое время хранения истории (у меня 365дней)
  • создать объект с именем города (например: Ekaterinburg)
  • заполнить свойства city_id и city в созданном объекте (к примеру: 28440 и Екатеринбург)
  • создать сценарий WeatherFromYandex и вставить в него указанный выше код
  • найти метод onNewMinute и добавить в него строку if ($m%30 == 0) {runScript("WeatherFromYandex");}// обновляем погоду с Яндекса каждые 30 минут
Изменения:
  • состояние ветра по шкале Бофорта
  • вычисляется время года
  • в прогноз погоды не пишутся пустые значения (не должны, по крайней мере)

Ссылки на полезные сообщения темы:
Скрины правильной настройки объектов.
Показ настроек минутного таймера с проверкой наличия интернета.
Рассказывает прогноз погоды Yandex по команде -"прогноз погоды", вместо demo погоды.
Предложения по улучшению кода (не вижу их в основном коде).
Использование данных в меню + код вставки.
Измененный код для забора данных из Яндекс пробок (из-за блокировки основного api).
Кусок кода для использования uuid.
Как найти свой uuid.
Ссылки на схожие темы:
Ссылка на ветку модуля OpenWeatherMap (альтернатива).
Ссылка на ветку модуля "Яндекс погода" (альтернатива).

Re: Погода (Яндекс)

Добавлено: Сб мар 21, 2015 10:27 pm
Vovix
Я бы эту строку:

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

sg($obj['TITLE'].".Image",$xml->fact->image);
заменил на эту:

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

sg($obj['TITLE'].".Image",$xml->fact->{'image-v3'});
во всяком случае по моему городу($city_id=28411) второй вариант работает правильно!!!

картинку вывожу вот этим кодом где надо:

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

<img src="http://yandex.st/weather/1.2.83/i/icons/48x48/%Izhevsk.Image%.png" alt="%Izhevsk.Type%" title="%Izhevsk.Type%">

Re: Погода (Яндекс)

Добавлено: Вс мар 22, 2015 8:45 am
Amarok
исправил

Re: Погода (Яндекс)

Добавлено: Вс мар 22, 2015 3:02 pm
xor
Добрый день!
А у меня время от времени вот так получается пропуск значений в forecast в разных местах:

Сегодня ночью будет -6°, ясно. Завтра днём будет 0°, ясно. Послезавтра ночью °, облачно, небольшой снег.

Re: Погода (Яндекс)

Добавлено: Вс мар 22, 2015 4:41 pm
Amarok
xor писал(а):Добрый день!
А у меня время от времени вот так получается пропуск значений в forecast в разных местах:

Сегодня ночью будет -6°, ясно. Завтра днём будет 0°, ясно. Послезавтра ночью °, облачно, небольшой снег.
Такая же фигня. Не знаю почему.

Re: Погода (Яндекс)

Добавлено: Вс мар 22, 2015 6:10 pm
sashmen
Доброе время суток.
А можно подробнее куда код пихать?
Куда ID пихать? :oops:

Re: Погода (Яндекс)

Добавлено: Вс мар 22, 2015 8:57 pm
Amarok
При создании объекта просто заполнить свойство city_id. В самом сценарии ничего править не надо. Если объектов будет несколько и у каждого будет заполнен city_id, то сценарий САМ их переберет и заполнит погодой. У меня так обрабатывается 6 городов.

Re: Погода (Яндекс)

Добавлено: Вс мар 22, 2015 9:02 pm
slgeo
Чтобы было под ключ, предлагаю ТС выложить архивом экспортированный класс с объектами

Re: Погода (Яндекс)

Добавлено: Вс мар 22, 2015 9:38 pm
Amarok
Выкладывать объекты не вижу смысла. Каждый объект это город.
Инструкция:
1. Создаем объект
Screenshot_1.jpg
Screenshot_1.jpg (34.55 КБ) 32676 просмотров
2. Заполняем всего 2 поля
Screenshot_2.jpg
Screenshot_2.jpg (92.54 КБ) 32676 просмотров
3. Готово

Re: Погода (Яндекс)

Добавлено: Вт мар 24, 2015 2:01 pm
sashmen
Добрый день.
if (date('G')==13) {sg($obj['TITLE'].".Temp13h",$temp);}
if (date('G')==21) {sg($obj['TITLE'].".Temp21h",$temp);}

Я правильно понимаю здесь указывается температура в определенные часы?