Как погоду настроить

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

sashmen
Сообщения: 27
Зарегистрирован: Ср ноя 05, 2014 11:21 pm
Благодарил (а): 19 раз
Поблагодарили: 3 раза

Re: Как погоду настроить

Сообщение sashmen » Пт мар 20, 2015 8:08 pm

Немножко причесал скрипт для яндекса:
КОДПоказать

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

$city_id=27612;
$data_file="http://export.yandex.ru/weather-ng/forecasts/$city_id.xml?".rand(); // адрес xml файла

$xml = simplexml_load_file($data_file); // раскладываем xml на массив

$temp=$xml->fact->temperature; // температура сегодна
// Если значение температуры положительно, для наглядности добавляем "+"
if ($temp>0) {$temp='+'.$temp;}

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


sg("Moscow.Temp",$temp);
sg("Moscow.City",$xml->fact->station);
sg("Moscow.Type",$xml->fact->weather_type); //состояние неба
sg("Moscow.Pressure",$xml->fact->pressure); //давление
sg("Moscow.Humidity",$xml->fact->humidity); //влажность
sg("Moscow.mslp_pressure",$xml->fact->mslp_pressure); //Среднее давление на уровне моря hPa  гПа (Гектопаскаль)
sg("Moscow.WindSpeed",$xml->fact->wind_speed); //скорость ветра
sg("Moscow.Image",$xml->fact->{'image-v3'});//картинка 
sg("Moscow.UpTime",$xml->fact->uptime); //последнее обновление
sg("Moscow.SunRise",$xml->day[0]->sunrise); //Восход солнца
sg("Moscow.SunSet",$xml->day[0]->sunset); //Заход солнца

foreach($xml->informer->temperature as $item) {
     if ($item["type"] == "night") {                   //температура ночью
sg("Moscow.temperature_night",$item);
     } elseif ($item["type"] == "tomorrow") {    //температура завтра
sg("Moscow.temperature_tomorrow",$item);
                      }
               }
 
$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 'ne':
     $dir="северо-восточное";
     break;
   case 'se':
     $dir="юго-восточное";
     break;
   case 'calm':
     $dir="штиль";
     break;
}
sg("Moscow.WindDir",$dir); //направление ветра


$dir1 = $xml->fact->season;
switch ($dir1){
   case 'winter':
     $dir1="ЗИМА";
     break;
   case 'summer':
     $dir1="ЛЕТО";
     break;
   case 'autumn': 
    $dir1="ОСЕНЬ";
     break;
   case 'spring':
     $dir1="ВЕСНА";
     break;
  }
sg("Moscow.season",$dir1); //времена года
 
За это сообщение автора sashmen поблагодарил:
Amarok (Сб мар 21, 2015 4:55 am)
Рейтинг: 1.16%
Сервер на raspberry pi Noolite SRF-10-1000, PT111, PU-411, mtrf-64-usb
Connect
Аватара пользователя
Amarok
Сообщения: 1425
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Как погоду настроить

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

sashmen писал(а):Немножко причесал скрипт для яндекса:
//времена года
Спасибо, добавил сюда
Алиска живёт на Ubuntu Server 14.04.3 LTS
connect, группа в Telegram, Яндекс.Деньги для благодарностей за помощь: 41001355945165
HeadMan
Сообщения: 1
Зарегистрирован: Вт апр 28, 2015 8:16 pm
Благодарил (а): 0
Поблагодарили: 0

Re: Как погоду настроить

Сообщение HeadMan » Вт апр 28, 2015 9:22 pm

Настроил у себя стандартный информер gismeteo (http://www.gismeteo.ru/informers/), может еще кому понадобится.
Проблема с этими информерами заключается в том, что гисметео их привязывает к имени хоста, указанному в конструкторе. Причем, для того чтобы он отображался в локальной сети, при формировании информера нужно указать именно локальный адрес сервера, но тогда он не работает извне. И наоборот.
Ок, формируем два одинаковых информера, но в одном указываем локальный адрес сервера, в другом - глобальный.
В html-блоке используем следующий код:

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

<div id = "localdiv" style="display:none; width:100%;">
    содержимое локального информера
 </div>
 
<div id="outborderdiv" style="display:none; width:100%;">
  содержимое глобального информера
</div>
 
          <script type="text/javascript">
            var x = location.hostname;
            if(x =='локальный адрес вашего сервера с MD')
               {
                   var thisdiv = document.getElementById("localdiv");
               }
               else
               {
                   var thisdiv = document.getElementById("outborderdiv");
               }
          
             thisdiv.style["display"] = "block";
        </script>
Результат:
gismeteo.png
gismeteo.png (34.09 КБ) 13899 просмотров
Ko/|xo3HUk
Сообщения: 160
Зарегистрирован: Ср окт 07, 2015 9:36 am
Благодарил (а): 51 раз
Поблагодарили: 27 раз

Re: Как погоду настроить

Сообщение Ko/|xo3HUk » Чт окт 08, 2015 10:23 pm

А подскажите - как в полученном из шаблона тексте заменить один текст на другой? В частности - для http://ru-meteo.ru/ создал шаблон

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

<td class="temp t.?">(.+?)<td class="more">
В итоге получаю текст вида:
+4°</td><td class="icons"><img src="static/i/clip3/cloudy.png">
И в этой строке мне нужно к локальным ссылкам добавить реальный адрес (чтобы иконки погоды отображались), т.е. заменить "static" на "http://ru-meteo.ru/static". Как это сделать? Только сценариями? Или как-то можно дописать регулярное выражение типа: "~s/source_text/replaced_text/eg"?
Текущий сервер: Ноутбук: HP Probook 4515s (без монитора). ОС: Debian GNU/Linux 8.6 (jessie)
Предыдущий сервер: Raspberry Pi 2B. ОС: Raspbian (jessie)
Ko/|xo3HUk
Сообщения: 160
Зарегистрирован: Ср окт 07, 2015 9:36 am
Благодарил (а): 51 раз
Поблагодарили: 27 раз

Re: Как погоду настроить

Сообщение Ko/|xo3HUk » Пт ноя 06, 2015 12:04 pm

Ну, раз никто решения не подсказал, расскажу как я костыли прикрутил :)
В общем - просто скачал картинки, на которые были локальные ссылки и сохранил по тому же адресу, но уже на своей RPi:

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

pi@raspberrypi /var/www/static/i/clip3 $ ls -l
-rw-r--r-- 1 root root 4997 Nov 24  2013 cloudy.png
-rw-r--r-- 1 root root  730 Aug 16  2014 moon.png
-rw-r--r-- 1 root root 1282 Aug 16  2014 party_cloudy_moon.png
-rw-r--r-- 1 root root 5362 Nov 28  2013 party_cloudy.png
-rw-r--r-- 1 root root 4436 Nov 24  2013 rain.png
-rw-r--r-- 1 root root 4887 Nov 24  2013 snow.png
-rw-r--r-- 1 root root 5276 Nov 28  2013 sun.png
Текущий сервер: Ноутбук: HP Probook 4515s (без монитора). ОС: Debian GNU/Linux 8.6 (jessie)
Предыдущий сервер: Raspberry Pi 2B. ОС: Raspbian (jessie)
geor
Сообщения: 83
Зарегистрирован: Сб май 17, 2014 2:52 am
Откуда: Новосибирск
Благодарил (а): 10 раз
Поблагодарили: 4 раза

Re: Как погоду настроить

Сообщение geor » Пт мар 11, 2016 4:16 pm

Перестал отрабатывать скрипт после последних обновлений.
СпойлерПоказать
$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 = 'Сейчас так же как вчера'; }
}
Пробовал установить дополнение "Yandex.Weather" - тоже не работает.
У кого-нибудь есть такая проблема?
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

Re: Как погоду настроить

Сообщение skysilver » Пт мар 11, 2016 4:52 pm

У меня сценарий работает. А вот яндекс чудит последние пару дней - отдает xml-ку через раз. ))

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

16:42:08 ERROR [script.getWeatherFromYandex]: Не удалось получить данные от сервиса Яндекс.Погода. Выполнено 2 попыток.
16:22:08 ERROR [script.getWeatherFromYandex]: Данные от сервиса Яндекс.Погода получены, но возникли ошибки.
16:12:09 ERROR [script.getWeatherFromYandex]: Не удалось получить данные от сервиса Яндекс.Погода. Выполнено 2 попыток. 
16:02:09 ERROR [script.getWeatherFromYandex]: Не удалось получить данные от сервиса Яндекс.Погода. Выполнено 2 попыток. 
15:52:09 ERROR [script.getWeatherFromYandex]: Не удалось получить данные от сервиса Яндекс.Погода. Выполнено 2 попыток. 
15:42:08 ERROR [script.getWeatherFromYandex]: Не удалось получить данные от сервиса Яндекс.Погода. Выполнено 2 попыток. 
15:32:09 ERROR [script.getWeatherFromYandex]: Не удалось получить данные от сервиса Яндекс.Погода. Выполнено 2 попыток. 
15:22:09 ERROR [script.getWeatherFromYandex]: Не удалось получить данные от сервиса Яндекс.Погода. Выполнено 2 попыток. 
15:12:09 ERROR [script.getWeatherFromYandex]: Данные от сервиса Яндекс.Погода получены, но возникли ошибки.
15:02:09 ERROR [script.getWeatherFromYandex]: Не удалось получить данные от сервиса Яндекс.Погода. Выполнено 2 попыток. 
14:52:08 ERROR [script.getWeatherFromYandex]: Не удалось получить данные от сервиса Яндекс.Погода. Выполнено 2 попыток. 
14:42:09 ERROR [script.getWeatherFromYandex]: Данные от сервиса Яндекс.Погода получены, но возникли ошибки.
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Аватара пользователя
adzam
Сообщения: 602
Зарегистрирован: Сб дек 08, 2012 10:28 pm
Откуда: Кишинев
Благодарил (а): 20 раз
Поблагодарили: 138 раз

Re: Как погоду настроить

Сообщение adzam » Пт мар 11, 2016 9:43 pm

geor писал(а):Перестал отрабатывать скрипт после последних обновлений.

Пробовал установить дополнение "Yandex.Weather" - тоже не работает.
У кого-нибудь есть такая проблема?
У меня тоже перестал загружаться, сначало через раз а теперь и вовсе потух.....
Мои проекты здесь...https://connect.smartliving.ru/profile/41/blog213.htm
Если вам помогло какое-либо мое сообщение - не ленитесь пользоваться кнопкой СПАСИБО.
PAV
Сообщения: 949
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва
Благодарил (а): 68 раз
Поблагодарили: 94 раза

Re: Как погоду настроить

Сообщение PAV » Ср апр 27, 2016 11:27 am

+1. Поставил вызов скрипта три раза подряд, вроде держится пока
PAV
Сообщения: 949
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва
Благодарил (а): 68 раз
Поблагодарили: 94 раза

Re: Как погоду настроить

Сообщение PAV » Чт май 19, 2016 5:22 pm

Все, Яндекс прекратил поддержку export.yandex надо другое что-то искать
Ответить