$data_file='
https://export.yandex.ru/weather-ng/for ... xml?'.rand(); // адрес xml файла. 29634 - id города
$urlimg='
http://yandex.st/weather/1.2.61/i/icons/48x48/'; // адрес картинок на сайте Яндекс
$path='./images/weather_yandex_v3/'; // локальный путь к базе картинок
$xml = simplexml_load_file($data_file); // раскладываем xml на массив
//$obj->setProperty('sunRise',$xml->day[0]->sunrise);
//$obj->setProperty('sunSet',$xml->day[0]->sunset);
//$obj->setProperty('moonRise',$xml->day[0]->moonrise);
//$obj->setProperty('moonSet',$xml->day[0]->moonset);
//$obj->setProperty('moonPhase',$xml->day[0]->moon_phase);
$ot='today_day';
$obj=getObject($ot);
$obj->setProperty('temperature',$xml->day[0]->day_part[4]->temperature);
$s=$xml->day[0]->day_part[4]->weather_type;
// если в текущем прогнозе есть дождь, а ранее его небыло
if (strpos($s, 'дожд') !== false) {
if (strpos($obj->getProperty('weatherType'), 'дожд') === false) {
say('Прогноз погоды предупреждает о возможном дожде.');
}}
$obj->setProperty('weatherType', $s);
$obj->setProperty('pressure',$xml->day[0]->day_part[4]->pressure);
$obj->setProperty('humidity',$xml->day[0]->day_part[4]->humidity);
$obj->setProperty('windSpeed',$xml->day[0]->day_part[4]->wind_speed);
$obj->setProperty('image',$xml->day[0]->day_part[4]->{'image-v3'});
$obj->setProperty('windDirection',$xml->day[0]->day_part[4]->wind_direction);
$ot='today_night';
$obj=getObject($ot);
$obj->setProperty('temperature',$xml->day[0]->day_part[5]->temperature);
$obj->setProperty('weatherType',$xml->day[0]->day_part[5]->weather_type);
$obj->setProperty('pressure',$xml->day[0]->day_part[5]->pressure);
$obj->setProperty('humidity',$xml->day[0]->day_part[5]->humidity);
$obj->setProperty('windSpeed',$xml->day[0]->day_part[5]->wind_speed);
$obj->setProperty('image',$xml->day[0]->day_part[5]->{'image-v3'});
$obj->setProperty('windDirection',$xml->day[0]->day_part[5]->wind_direction);
$ot='tomorrow_day';
$obj=getObject($ot);
$obj->setProperty('temperature',$xml->day[1]->day_part[4]->temperature);
$obj->setProperty('weatherType',$xml->day[1]->day_part[4]->weather_type);
$obj->setProperty('pressure',$xml->day[1]->day_part[4]->pressure);
$obj->setProperty('humidity',$xml->day[1]->day_part[4]->humidity);
$obj->setProperty('windSpeed',$xml->day[1]->day_part[4]->wind_speed);
$obj->setProperty('image',$xml->day[1]->day_part[4]->{'image-v3'});
$obj->setProperty('windDirection',$xml->day[1]->day_part[4]->wind_direction);
$ot='tomorrow_night';
$obj=getObject($ot);
$obj->setProperty('temperature',$xml->day[1]->day_part[5]->temperature);
$obj->setProperty('weatherType',$xml->day[1]->day_part[5]->weather_type);
$obj->setProperty('pressure',$xml->day[1]->day_part[5]->pressure);
$obj->setProperty('humidity',$xml->day[1]->day_part[5]->humidity);
$obj->setProperty('windSpeed',$xml->day[1]->day_part[5]->wind_speed);
$obj->setProperty('image',$xml->day[1]->day_part[5]->{'image-v3'});
$obj->setProperty('windDirection',$xml->day[1]->day_part[5]->wind_direction);
$ot='weather_now';
$obj=getObject($ot);
$obj->setProperty('updated',time());
$obj->setProperty('updatedTime',date('H:i',time()));
$obj->setProperty('alive',1);
$alive_timeout=(int)$obj->getProperty('aliveTimeOut');
if (!$alive_timeout) { $alive_timeout=12*60*60; }
setTimeOut($ot.'_alive',"sg('".$ot.".alive',0);",$alive_timeout);
$obj->setProperty('weatherType',$xml->fact->weather_type);
$obj->setProperty('pressure',$xml->fact->pressure);
$obj->setProperty('humidity',$xml->fact->humidity);
$obj->setProperty('windDirection',$xml->fact->wind_direction);
$obj->setProperty('uptime',$xml->fact->uptime);
$s=$xml->fact->wind_speed;
if ($s>=10) {$s=round($s);}
if ($s==0) {$s=0;}
$obj->setProperty('windSpeed',$s);
$s=$xml->fact->{'image-v3'};
$obj->setProperty("image",$s);
// скачать файл картинки с яндекса, если ее у нас нет
if (!file_exists($path.$s.'.png')) {
file_put_contents($path.$s.'.png', file_get_contents($urlimg.$s.'.png'));
}
$s=$xml->fact->temperature;
if ($s>0) {$s='+'.$s;} // добавить "+"
$obj->setProperty('temperature',$s);
// $s будет использована ниже при сравнении температур
$obj_title = $ot; // 'weather_now'; //имя объекта
$prop_title = 'temperature'; //имя свойства
// Имена объектов находятся в таблице objects и они должны быть уникальными
// Для начала нам нужно получить id нашего объекта и id класса которому принадлежит объект
$arr_s = SQLSelectOne("SELECT * FROM objects WHERE TITLE='".$obj_title."'");
$obj_id = $arr_s['ID'];
$class_id = $arr_s['CLASS_ID'];
/* Имена свойств находятся в таблице properties
с указанием id класса если свойство заданно на уровне класса,
или id объекта если свойство принадлежит объекту лично.
*/
// Получим id свойства по его имени И (id класса ИЛИ id объекта)
$arr_s = SQLSelectOne("SELECT * FROM properties WHERE TITLE='".$prop_title."' AND (CLASS_ID='".$class_id."' OR OBJECT_ID='".$obj_id."')");
$prop_id = $arr_s['ID'];
// значения свойств находятся в таблице pvalues
// Нам нужен id. (уточнить необходимость сортировки по UPDATED)
$arr_s = SQLSelectOne("SELECT * FROM pvalues WHERE OBJECT_ID='".$obj_id."' AND PROPERTY_ID='".$prop_id."'");
$pvalue = $arr_s['ID'];
/* Можно использовать альтернативный вариант, который будет работать намного быстрее.
Получить id из таблицы pvalues сразу по имени Объект.Свойство
Способ довольно простой и короткий, но пока что рекомендую его не использовать
ввиду возможных проблем с не обновленными системами.
$prop_name = 'ts_kitchen.status'; //Объект.Свойство
$arr_s = SQLSelectOne("SELECT * FROM pvalues WHERE PROPERTY_NAME='".$prop_name."'");
$pvalue = $arr_s['ID'];
*/
/* Зная $pvalue можно слазать за данными истории в таблицу phistory
Для нашей задачи нужна одна ближайшая запись до указанного времени
*/
$arr_s = SQLSelectOne("SELECT * FROM phistory WHERE VALUE_ID=".$pvalue." AND ADDED<='".date('Y-m-d H:i:s', strtotime('-1 day'))."' ORDER BY ADDED DESC LIMIT 0 , 1");
$os=$arr_s['VALUE'];
$msg='';
if (strlen($os)) {
if ($os>$s) { $msg = 'Сейчас холоднее на '.($os-$s).'℃'; } // Вчера было теплее на
elseif ($os<$s) { $msg = 'Сейчас теплее на '.($s-$os).'℃'; } // Вчера было холоднее на
else { $msg = 'Сейчас так же как вчера'; }
}