[Модуль] Погода Яндекс (yandexweather)

Разработка дополнительных модулей, подключение различных приложений.

Модератор: immortal

ZyaK
Сообщения: 407
Зарегистрирован: Вт окт 24, 2017 2:01 pm
Откуда: Ижевск
Благодарил (а): 45 раз
Поблагодарили: 69 раз

Re: [Модуль] Погода Яндекс (yandexweather)

Сообщение ZyaK » Чт ноя 18, 2021 7:50 pm

Подскажите пожалуйста, как быть? с наступлением холодов столкнулся с проблемой передачи символов от яндекса
в общем котел по MQTT у меня ждет знак "-" , а с яндекса прилетает не минус, а длинная черта похожая на минус, но нифига она не минус
как определить символ который необходимо ждать котлу? или как поменять символ на минус?
первая картинка знак минус, вторая хрен пойми что - получаемое с яндекса
Вложения
2.PNG
2.PNG (9.51 КБ) 1715 просмотров
1.PNG
1.PNG (10.5 КБ) 1715 просмотров
PI2 + MQTT + 5 ESP8266 + Atmega16
Аватара пользователя
xor
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 284 раза
Поблагодарили: 629 раз

Re: [Модуль] Погода Яндекс (yandexweather)

Сообщение xor » Чт ноя 18, 2021 10:42 pm

ZyaK писал(а):
Чт ноя 18, 2021 7:50 pm
Подскажите пожалуйста, как быть? с наступлением холодов столкнулся с проблемой передачи символов от яндекса
в общем котел по MQTT у меня ждет знак "-" , а с яндекса прилетает не минус, а длинная черта похожая на минус, но нифига она не минус
как определить символ который необходимо ждать котлу? или как поменять символ на минус?
первая картинка знак минус, вторая хрен пойми что - получаемое с яндекса
1. в модуле москито последний пункт Replace List - можно попробовать замену ваша_длинная_черта=-
не знаю, прокатит ли с частичной заменой?
2. привязать в моските не свойство, а метод. и в методе менять ваша_длинная_черта на минус
3. в свойстве класса можно определить правило обработки приходящего значения и там делать замену. пункт Проверка значений
пс. это в модуле яндексвезер такие данные? как он графики, интересно, отрицательных температур рисует?
ZyaK
Сообщения: 407
Зарегистрирован: Вт окт 24, 2017 2:01 pm
Откуда: Ижевск
Благодарил (а): 45 раз
Поблагодарили: 69 раз

Re: [Модуль] Погода Яндекс (yandexweather)

Сообщение ZyaK » Пт ноя 19, 2021 2:03 pm

xor писал(а):
Чт ноя 18, 2021 10:42 pm
это в модуле яндексвезер такие данные? как он графики, интересно, отрицательных температур рисует?
это уже не в модуле, а в скрипте, тут выше где то выкладывали скрипт.

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

$city = 142737; // поменять на свой
    $url= 'https://yandex.ru/pogoda/' . $city;
    $str = file_get_contents($url);
    $dom = phpQuery::newDocument($str);
  // считываем данные на несколько дней вперед
   foreach($dom->find(".forecast-briefly__day-link") as $key => $value){
  // Преобразуем dom объект в объект phpQuery.
  //Делаем сие действие с помощью метода pq(); который является аналогом ($) в jQuery.
    $pq = pq($value);
  // Находим в этом элементе элементы 
    $day[$key]["day"] = $pq->find(".forecast-briefly__name")->text();
    $day[$key]["time"] = $pq->find(".forecast-briefly__date")->text();
    $day[$key]["icon"] = $pq->find(".forecast-briefly__icon")->attr('src');  
    $day[$key]["temp_day"] = $pq->find(".forecast-briefly__temp_day .temp__value")->text();
    $day[$key]["temp_night"] = $pq->find(".forecast-briefly__temp_night .temp__value")->text();
    $day[$key]["condition"] = $pq->find(".forecast-briefly__condition")->text();
   }
	// заменить 10 на количество дней, за которые хотите иметь погоду
    for ($i = 1; $i <= 10; $i++) {
    // все глобальные свойства ниже создадутся автоматически, необходимо создать только weather
     	sg("weather.day".$i,$day[$i]["day"] );
   		sg("weather.time".$i,$day[$i]["time"] );
        $day[$i]["icon"] = str_replace("//yastatic.net/weather/i/icons/funky/dark/", '/cms/scenes/new/icons/', $day[$i]["icon"]);
        $day[$i]["icon"] = str_replace("png", "svg", $day[$i]["icon"]);
		sg("weather.icon".$i,$day[$i]["icon"] );
        sg("weather.temp_day".$i,$day[$i]["temp_day"] );
		sg("weather.temp_night".$i,$day[$i]["temp_night"] );
		sg("weather.condition".$i,$day[$i]["condition"] );
    }
  //считываем данные за текущий день  
    $pq=pq($dom->find(".fact") );
    $fact["temp"] = $pq->find(".fact__temp-wrap .link .fact__temp .temp__value")->text();
    $fact["icon"] = $pq->find(".fact__temp-wrap .link .icon")->attr('src');  
    $fact["feel"] = $pq->find(".fact__temp-wrap .link .link__feelings .term .term__value")->text();
    $fact["wind"] = $pq->find(".fact__props .fact__wind-speed .term__value .wind-speed")->text();
    $fact["wind_word"] = $pq->find(".fact__props .fact__wind-speed .term__value")->attr('aria-label'); 
	$fact["wind_dir"] = $pq->find(".fact__props .fact__wind-speed .term__value .fact__unit .icon-abbr")->text();
    $fact["hum"] = $pq->find(".fact__props .fact__humidity .term__value ")->text(); 
    $fact["hum_word"] = $pq->find(".fact__props .fact__humidity .term__value ")->attr('aria-label'); 
	$fact["press"] = $pq->find(".fact__props .fact__pressure .term__value")->text();
    $fact["press_word"] = $pq->find(".fact__props .fact__pressure .term__value")->attr('aria-label'); 

    $fact["icon"] = str_replace("//yastatic.net/weather/i/icons/funky/light/", '/cms/scenes/new/icons/', $fact["icon"]);
    $fact["icon"] = str_replace("png", "svg", $fact["icon"]);
  
//соберем погоду по часам
    $i=0; //счетчик
    foreach($dom->find(".fact__hour") as $key => $value){
      $pq = pq($value);
      if (substr($pq->find(".fact__hour-elem .fact__hour-label")->text(),-3)==":00"   ) { //если время заканчивается на целый час
       	// то сохраним в массив, иначе это было время восхода/заката и это включать в массив не будем
      	$hours[$i]["time"] = $pq->find(".fact__hour-elem .fact__hour-label")->text();
      	$hours[$i]["icon"]= $pq->find(".fact__hour-elem .icon")->attr('src');
      	$hours[$i]["temp"]= $pq->find(".fact__hour-elem .fact__hour-temp")->text();
      	$i=$i+1;//увеличим счетчик
      } 
     }

	$j=0;//счетчик
    for ($i = 0; $i <= count($hours); $i+=6) { //выведем только кажый 6-ой час
   	    $hours[$i]["icon"]= str_replace("//yastatic.net/weather/i/icons/funky/flat/", '/cms/scenes/new/icons/', $hours[$i]["icon"]);
    	$hours[$i]["icon"] = str_replace("png", "svg", $hours[$i]["icon"]);
		sg("weather.hour_time".$j,$hours[$i]["time"] );
     	sg("weather.hour_icon".$j,$hours[$i]["icon"] );
     	sg("weather.hour_temp".$j,$hours[$i]["temp"] );
        $j+=1;
    } 

    sg("weather.fact_temp",$fact["temp"] );
    sg("weather.fact_icon",$fact["icon"] );
	sg("weather.fact_feel",$fact["feel"] );
    sg("weather.fact_wind",$fact["wind"] );
    sg("weather.fact_wind_word",$fact["wind_word"] );
    sg("weather.fact_wind_dir",$fact["wind_dir"] );
    sg("weather.fact_hum",$fact["hum"] );
	sg("weather.fact_hum_word",$fact["hum_word"] );
	sg("weather.fact_press",$fact["press"] );
	sg("weather.fact_press_word",$fact["press_word"] );


	// заменить 10 на количество необходимых прогнозируемых дней
    for ($i = 1; $i <= 10; $i++) {
    // все глобальные свойства ниже создадутся автоматически, необходимо создать только weather
     	sg("weather.day".$i,$day[$i]["day"] );
   		sg("weather.time".$i,$day[$i]["time"] );
        $day[$i]["icon"] = str_replace("//yastatic.net/weather/i/icons/funky/dark/", '/cms/scenes/new/icons/', $day[$i]["icon"]);
        $day[$i]["icon"] = str_replace("png", "svg", $day[$i]["icon"]);
		sg("weather.icon".$i,$day[$i]["icon"] );
        sg("weather.temp_day".$i,$day[$i]["temp_day"] );
		sg("weather.temp_night".$i,$day[$i]["temp_night"] );
		sg("weather.condition".$i,$day[$i]["condition"] );
    }

   //восход, закат
	$sunrise=pq($dom->find(".sun-card__sunrise-sunset-info_value_rise-time") );
	$sunrise=substr($sunrise->text() , -5); //нужны только последние 5 символов
    $sunset =pq($dom->find(".sun-card__sunrise-sunset-info_value_set-time") );
	$sunset=substr($sunset->text(), -5); //нужны только последние 5 символов
	sg("weather.sunrise",$sunrise);
	sg("weather.sunset",$sunset);
    sg("weather.updated", date('l jS \of F Y h:i:s A'));

графики вообще никак не рисует и картинки тоже почему то прикрутить не получается. в общем костыль на костыле :D
завтра попробую поковырять, о результате отпишусь.
upd попробовал замену в MQTT не прокатывает
вот что прилетает от яндекса
Вложения
2.JPG
2.JPG (65.51 КБ) 1637 просмотров
1.JPG
1.JPG (32.4 КБ) 1641 просмотр
PI2 + MQTT + 5 ESP8266 + Atmega16
Аватара пользователя
xor
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 284 раза
Поблагодарили: 629 раз

Re: [Модуль] Погода Яндекс (yandexweather)

Сообщение xor » Пт ноя 19, 2021 6:04 pm

ZyaK писал(а):
Пт ноя 19, 2021 2:03 pm
...
ну тут в скрипте и править перед sg этот минус для температур везде.
поискать аналог str_replace для юникода, если штатной функции нет, своё что-нибудь написать(
Михря
Сообщения: 21
Зарегистрирован: Вс сен 01, 2019 1:14 pm
Благодарил (а): 2 раза
Поблагодарили: 5 раз

Re: [Модуль] Погода Яндекс (yandexweather)

Сообщение Михря » Ср ноя 24, 2021 11:44 pm

dimaxus писал(а):
Чт мар 11, 2021 6:37 pm
Михря писал(а):
Пт янв 08, 2021 2:48 pm
чет мне надоела двух месячная борьба с модулем.
сделал парсесер export.yandex.ru/bar/reginfo.xml

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

function getinfoDataXml($city = 213) {
    $info = array();
    $cache_file = $_SERVER['DOCUMENT_ROOT']."/cached/weather.txt";
    $url='http://export.yandex.ru/bar/reginfo.xml?region='.$city.'.xml';
     $ch = curl_init($url);
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
     $data = curl_exec($ch);
     curl_close($ch);
     file_put_contents($cache_file, $data);
     $buf = file_get_contents($url);
     if ($buf) file_put_contents($cache_file, $buf);

    $xml = simplexml_load_file($cache_file);
    $info['temp'] = $xml->weather->day->day_part[0]->temperature;
    $info['image'] = $xml->weather->day->day_part[0]->image;
    $info['image'] = str_replace("https://yastatic.net/weather/i/icons/blueye/24/", '/cms/scenes/new/icons/', $info['image']);
    $info['image'] = str_replace("png", "svg", $info['image']);
    $info['weather_type'] = $xml->weather->day->day_part[0]->weather_type;
    $info['level']= $xml->traffic->region->level;
    $info['icon']= $xml->traffic->region->icon;
    $info['hint lang']= $xml->traffic->region->hint[0];
    return $info;
}
$info = getinfoDataXml();
sg("weather.temp",$info['temp']);
sg("weather.image",$info['image']);
sg("weather.weather_type",$info['weather_type']);

sg("probki.level",$info['level']);
sg("probki.icon",$info['icon']);
sg("probki.hintlang",$info['hint lang']);
сносим к хренам яндекс.пробки и яндекс.погоду, функцию запихиваем в cron на каждые 15 мин. в переменной $city = 213, указываем код своего региона, создаем два объект probki и weather со свойствами из функции. архив с иконками распаковываем и закидываем /cms/scenes/new/icons/, ну или меняем на свой путь.
Добрый вечер всем. Уважаемый Михря вчера перестал работать ваш парсер , хотя последние 3 месяца прекрасно работал. Может что в Яндексе изменили, как проверить, подправить? Или проблема только у меня?
У меня все норм, что в логах?
Аватара пользователя
harrysmith
Сообщения: 80
Зарегистрирован: Чт сен 29, 2016 5:49 pm
Благодарил (а): 5 раз
Поблагодарили: 2 раза

Re: [Модуль] Погода Яндекс (yandexweather)

Сообщение harrysmith » Пт янв 14, 2022 4:56 pm

Уважаемый создатель сейчас на вашем модуле висит "Получение прогноза погоды Яндекс (модуль временно не работает)."
Не смогли бы вы подсказать он еще будет работать и если будет, то когда можно на это надеяться. Если он вообще не будет работать так может стоит убрать его из модулей.
За это сообщение автора harrysmith поблагодарил:
mojorserver (Вс июл 03, 2022 7:24 pm)
Рейтинг: 1.16%
Harry Smith
PAV
Сообщения: 949
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва
Благодарил (а): 68 раз
Поблагодарили: 94 раза

Re: [Модуль] Погода Яндекс (yandexweather)

Сообщение PAV » Ср июн 28, 2023 11:09 am

В общем пока модуль не работает, переработал свой скрипт получения погоды.
Нужно получить ключ Yandex API
Пользуйтесь...

UPD добавил расшифровку погодных условий

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

header("Access-Control-Allow-Origin: *");
$opts = array(
  'http' => array(
    'method' => "GET",
    'header' => "X-Yandex-API-Key:ВАШ КЛЮЧ API"
  )
);

$url = "https://api.weather.yandex.ru/v2/informers?lat=55.755863&lon=37.6177&extra=true";
$context = stream_context_create($opts);
$contents = file_get_contents($url, false, $context);
$data = json_decode($contents);
$weather=$data->fact;
sg("Moscow.Temp",$weather->temp);
sg("Moscow.Pressure",$weather->pressure_mm);
sg("Moscow.Humidity",$weather->humidity);
sg("Moscow.WindSpeed",$weather->wind_speed);
sg("Moscow.Image","https://yastatic.net/weather/i/icons/funky/dark/".$weather->icon.".svg");
sg("Moscow.UpTime",$weather->obs_time);
$dir = $weather->wind_dir;
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 'calm':
     $dir="штиль";
     break;
}
sg("Moscow.WindDir",$dir);
$cond = $weather->condition;
switch ($cond){
   case 'clear':
     $cond="ясно";
     break;
   case 'partly-cloudy':
     $cond="малооблачно";
     break;
   case 'cloudy':
     $cond="облачно";
     break;
   case 'overcast':
     $cond="пасмурно";
     break;
   case 'light-rain':
     $cond="небольшой дождь";
     break;
   case 'rain':
     $cond="дождь";
     break;
   case 'heavy-rain':
     $cond="сильный дождь";
     break;
   case 'showers':
     $cond="ливень";
     break;
   case 'wet-snow':
     $cond="дождь со снегом";
     break;
   case 'light-snow':
     $cond="небольшой снег";
     break;
   case 'snow':
     $cond="снег";
     break;
   case 'snow-showers':
     $cond="снегопад";
     break;
   case 'hail':
     $cond="град";
     break;
   case 'thunderstorm':
     $cond="гроза";
     break;
   case 'thunderstorm-with-rain':
     $cond="дождь с грозой";
     break;
   case 'thunderstorm-with-hail':
     $cond="гроза с градом";
     break;
}
sg("Moscow.Type",$cond);
//Прогноз дождя
sg('Moscow.Rain',0);
$rra = $weather->condition;
$rain = (string) $rra;
if (strpos($rain, "rain") !== false) $rain = 30;
if (strpos($rain, "shower") !== false) $rain = 30;
if (strpos($rain, "hail") !== false) $rain = 30;
if (strpos($rain, "thunder") !== false) $rain = 30;
$rainp = $rain + $data->forecast->parts[0]->prec_prob + $data->forecast->parts[1]->prec_prob;
if ($rainp > 0) sg('Moscow.Rain',1);
За это сообщение автора PAV поблагодарили (всего 2):
andrey040670 (Ср июн 28, 2023 11:18 am) • viss1 (Пт июл 28, 2023 5:57 pm)
Рейтинг: 2.33%
ZyaK
Сообщения: 407
Зарегистрирован: Вт окт 24, 2017 2:01 pm
Откуда: Ижевск
Благодарил (а): 45 раз
Поблагодарили: 69 раз

Re: [Модуль] Погода Яндекс (yandexweather)

Сообщение ZyaK » Вс июл 23, 2023 6:47 am

PAV писал(а):
Ср июн 28, 2023 11:09 am
В общем пока модуль не работает, переработал свой скрипт получения погоды.
Нужно получить ключ Yandex API
Пользуйтесь...
у меня не заработал. ключ ввел, координаты тоже и ничего

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

Warning: A non-numeric value encountered in /var/www/html/modules/scripts/scripts.class.php(167) : eval()'d code on line 55
PI2 + MQTT + 5 ESP8266 + Atmega16
Ответить