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

Не требует установки программ или изменения файлов

Модераторы: immortal, newz20

Аватара пользователя
Amarok
Сообщения: 1425
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

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

Сообщение Amarok » Сб мар 21, 2015 4:59 am

Прогноз погоды с 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 (альтернатива).
Ссылка на ветку модуля "Яндекс погода" (альтернатива).
Последний раз редактировалось Amarok Вт апр 14, 2015 8:47 am, всего редактировалось 9 раз.
За это сообщение автора Amarok поблагодарили (всего 2):
sashmen (Вт мар 24, 2015 2:23 pm) • Otto (Сб апр 09, 2016 7:37 am)
Рейтинг: 2.33%
Аватара пользователя
Vovix
Сообщения: 1155
Зарегистрирован: Пн янв 27, 2014 1:43 am
Откуда: г.Ижевск
Благодарил (а): 60 раз
Поблагодарили: 531 раз
Контактная информация:

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

Сообщение Vovix » Сб мар 21, 2015 10:27 pm

Я бы эту строку:

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

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%">
За это сообщение автора Vovix поблагодарил:
Amarok (Вс мар 22, 2015 8:44 am)
Рейтинг: 1.16%
Мой -CONNECT-
Windows 7(PHP 7.2) + Raspberry Pi(освещение на 1-Wire) + MP751(управление) + ESP8266(сенсоры) + LAN(сенсоры)
-=: Если вам помогло моё сообщение, нажмите кнопку "Поблагодарить за сообщение автора: Vovix" (кнопка Спасибо) справа! :=-
Аватара пользователя
Amarok
Сообщения: 1425
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

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

Сообщение Amarok » Вс мар 22, 2015 8:45 am

исправил
Алиска живёт на Ubuntu Server 14.04.3 LTS
connect, группа в Telegram, Яндекс.Деньги для благодарностей за помощь: 41001355945165
Аватара пользователя
xor
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 284 раза
Поблагодарили: 629 раз

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

Сообщение xor » Вс мар 22, 2015 3:02 pm

Добрый день!
А у меня время от времени вот так получается пропуск значений в forecast в разных местах:

Сегодня ночью будет -6°, ясно. Завтра днём будет 0°, ясно. Послезавтра ночью °, облачно, небольшой снег.
Аватара пользователя
Amarok
Сообщения: 1425
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

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

Сообщение Amarok » Вс мар 22, 2015 4:41 pm

xor писал(а):Добрый день!
А у меня время от времени вот так получается пропуск значений в forecast в разных местах:

Сегодня ночью будет -6°, ясно. Завтра днём будет 0°, ясно. Послезавтра ночью °, облачно, небольшой снег.
Такая же фигня. Не знаю почему.
Алиска живёт на Ubuntu Server 14.04.3 LTS
connect, группа в Telegram, Яндекс.Деньги для благодарностей за помощь: 41001355945165
sashmen
Сообщения: 27
Зарегистрирован: Ср ноя 05, 2014 11:21 pm
Благодарил (а): 19 раз
Поблагодарили: 3 раза

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

Сообщение sashmen » Вс мар 22, 2015 6:10 pm

Доброе время суток.
А можно подробнее куда код пихать?
Куда ID пихать? :oops:
Сервер на raspberry pi Noolite SRF-10-1000, PT111, PU-411, mtrf-64-usb
Connect
Аватара пользователя
Amarok
Сообщения: 1425
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

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

Сообщение Amarok » Вс мар 22, 2015 8:57 pm

При создании объекта просто заполнить свойство city_id. В самом сценарии ничего править не надо. Если объектов будет несколько и у каждого будет заполнен city_id, то сценарий САМ их переберет и заполнит погодой. У меня так обрабатывается 6 городов.
Алиска живёт на Ubuntu Server 14.04.3 LTS
connect, группа в Telegram, Яндекс.Деньги для благодарностей за помощь: 41001355945165
Аватара пользователя
slgeo
Сообщения: 551
Зарегистрирован: Чт фев 05, 2015 2:35 pm
Откуда: РнД
Благодарил (а): 139 раз
Поблагодарили: 74 раза

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

Сообщение slgeo » Вс мар 22, 2015 9:02 pm

Чтобы было под ключ, предлагаю ТС выложить архивом экспортированный класс с объектами
Raspberry Pi2 Model B + NRF24L01 (MySensors) + 1-Wire + Esp8266 (WiFi-IoT)
CONNECT
Аватара пользователя
Amarok
Сообщения: 1425
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

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

Сообщение Amarok » Вс мар 22, 2015 9:38 pm

Выкладывать объекты не вижу смысла. Каждый объект это город.
Инструкция:
1. Создаем объект
Screenshot_1.jpg
Screenshot_1.jpg (34.55 КБ) 32572 просмотра
2. Заполняем всего 2 поля
Screenshot_2.jpg
Screenshot_2.jpg (92.54 КБ) 32572 просмотра
3. Готово
За это сообщение автора Amarok поблагодарил:
sashmen (Вс мар 22, 2015 10:26 pm)
Рейтинг: 1.16%
Алиска живёт на Ubuntu Server 14.04.3 LTS
connect, группа в Telegram, Яндекс.Деньги для благодарностей за помощь: 41001355945165
sashmen
Сообщения: 27
Зарегистрирован: Ср ноя 05, 2014 11:21 pm
Благодарил (а): 19 раз
Поблагодарили: 3 раза

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

Сообщение sashmen » Вт мар 24, 2015 2:01 pm

Добрый день.
if (date('G')==13) {sg($obj['TITLE'].".Temp13h",$temp);}
if (date('G')==21) {sg($obj['TITLE'].".Temp21h",$temp);}

Я правильно понимаю здесь указывается температура в определенные часы?
Сервер на raspberry pi Noolite SRF-10-1000, PT111, PU-411, mtrf-64-usb
Connect
Ответить