Код: Выделить всё
$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 (альтернатива).
Ссылка на ветку модуля "Яндекс погода" (альтернатива).