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

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

Модератор: immortal

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

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

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

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

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

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

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

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 КБ) 224 просмотра
1.JPG
1.JPG (32.4 КБ) 228 просмотров
PI2 + MQTT + 5 ESP8266 + Atmega16
Аватара пользователя
xor
Сообщения: 1812
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 225 раз
Поблагодарили: 549 раз

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

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

ZyaK писал(а):
Пт ноя 19, 2021 2:03 pm
...
ну тут в скрипте и править перед sg этот минус для температур везде.
поискать аналог str_replace для юникода, если штатной функции нет, своё что-нибудь написать(
Михря
Сообщения: 18
Зарегистрирован: Вс сен 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 месяца прекрасно работал. Может что в Яндексе изменили, как проверить, подправить? Или проблема только у меня?
У меня все норм, что в логах?
Ответить