[Модуль] Погода Яндекс (yandexweather)
Модератор: immortal
-
- Сообщения: 407
- Зарегистрирован: Вт окт 24, 2017 2:01 pm
- Откуда: Ижевск
- Благодарил (а): 45 раз
- Поблагодарили: 69 раз
Re: [Модуль] Погода Яндекс (yandexweather)
Подскажите пожалуйста, как быть? с наступлением холодов столкнулся с проблемой передачи символов от яндекса
в общем котел по MQTT у меня ждет знак "-" , а с яндекса прилетает не минус, а длинная черта похожая на минус, но нифига она не минус
как определить символ который необходимо ждать котлу? или как поменять символ на минус?
первая картинка знак минус, вторая хрен пойми что - получаемое с яндекса
в общем котел по MQTT у меня ждет знак "-" , а с яндекса прилетает не минус, а длинная черта похожая на минус, но нифига она не минус
как определить символ который необходимо ждать котлу? или как поменять символ на минус?
первая картинка знак минус, вторая хрен пойми что - получаемое с яндекса
- Вложения
-
- 2.PNG (9.51 КБ) 2614 просмотров
-
- 1.PNG (10.5 КБ) 2614 просмотров
PI2 + MQTT + 5 ESP8266 + Atmega16
- xor
- Сообщения: 2045
- Зарегистрирован: Сб ноя 22, 2014 8:45 pm
- Благодарил (а): 289 раз
- Поблагодарили: 632 раза
Re: [Модуль] Погода Яндекс (yandexweather)
1. в модуле москито последний пункт Replace List - можно попробовать замену ваша_длинная_черта=-ZyaK писал(а): ↑Чт ноя 18, 2021 7:50 pmПодскажите пожалуйста, как быть? с наступлением холодов столкнулся с проблемой передачи символов от яндекса
в общем котел по MQTT у меня ждет знак "-" , а с яндекса прилетает не минус, а длинная черта похожая на минус, но нифига она не минус
как определить символ который необходимо ждать котлу? или как поменять символ на минус?
первая картинка знак минус, вторая хрен пойми что - получаемое с яндекса
не знаю, прокатит ли с частичной заменой?
2. привязать в моските не свойство, а метод. и в методе менять ваша_длинная_черта на минус
3. в свойстве класса можно определить правило обработки приходящего значения и там делать замену. пункт Проверка значений
пс. это в модуле яндексвезер такие данные? как он графики, интересно, отрицательных температур рисует?
win10 connect https://connect.smartliving.ru/profile/303
-
- Сообщения: 407
- Зарегистрирован: Вт окт 24, 2017 2:01 pm
- Откуда: Ижевск
- Благодарил (а): 45 раз
- Поблагодарили: 69 раз
Re: [Модуль] Погода Яндекс (yandexweather)
это уже не в модуле, а в скрипте, тут выше где то выкладывали скрипт.
Код: Выделить всё
$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'));

завтра попробую поковырять, о результате отпишусь.
upd попробовал замену в MQTT не прокатывает
вот что прилетает от яндекса
- Вложения
-
- 2.JPG (65.51 КБ) 2536 просмотров
-
- 1.JPG (32.4 КБ) 2540 просмотров
PI2 + MQTT + 5 ESP8266 + Atmega16
- xor
- Сообщения: 2045
- Зарегистрирован: Сб ноя 22, 2014 8:45 pm
- Благодарил (а): 289 раз
- Поблагодарили: 632 раза
Re: [Модуль] Погода Яндекс (yandexweather)
ну тут в скрипте и править перед sg этот минус для температур везде.
поискать аналог str_replace для юникода, если штатной функции нет, своё что-нибудь написать(
win10 connect https://connect.smartliving.ru/profile/303
-
- Сообщения: 21
- Зарегистрирован: Вс сен 01, 2019 1:14 pm
- Благодарил (а): 2 раза
- Поблагодарили: 5 раз
Re: [Модуль] Погода Яндекс (yandexweather)
У меня все норм, что в логах?dimaxus писал(а): ↑Чт мар 11, 2021 6:37 pmДобрый вечер всем. Уважаемый Михря вчера перестал работать ваш парсер , хотя последние 3 месяца прекрасно работал. Может что в Яндексе изменили, как проверить, подправить? Или проблема только у меня?Михря писал(а): ↑Пт янв 08, 2021 2:48 pmчет мне надоела двух месячная борьба с модулем.
сделал парсесер export.yandex.ru/bar/reginfo.xml
сносим к хренам яндекс.пробки и яндекс.погоду, функцию запихиваем в cron на каждые 15 мин. в переменной $city = 213, указываем код своего региона, создаем два объект probki и weather со свойствами из функции. архив с иконками распаковываем и закидываем /cms/scenes/new/icons/, ну или меняем на свой путь.Код: Выделить всё
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']);
- harrysmith
- Сообщения: 86
- Зарегистрирован: Чт сен 29, 2016 5:49 pm
- Благодарил (а): 5 раз
- Поблагодарили: 2 раза
Re: [Модуль] Погода Яндекс (yandexweather)
Уважаемый создатель сейчас на вашем модуле висит "Получение прогноза погоды Яндекс (модуль временно не работает)."
Не смогли бы вы подсказать он еще будет работать и если будет, то когда можно на это надеяться. Если он вообще не будет работать так может стоит убрать его из модулей.
Не смогли бы вы подсказать он еще будет работать и если будет, то когда можно на это надеяться. Если он вообще не будет работать так может стоит убрать его из модулей.
- За это сообщение автора harrysmith поблагодарил:
- mojorserver (Вс июл 03, 2022 7:24 pm)
- Рейтинг: 1.16%
Harry Smith
-
- Сообщения: 966
- Зарегистрирован: Пт дек 06, 2013 11:30 am
- Откуда: Москва
- Благодарил (а): 70 раз
- Поблагодарили: 95 раз
Re: [Модуль] Погода Яндекс (yandexweather)
В общем пока модуль не работает, переработал свой скрипт получения погоды.
Нужно получить ключ Yandex API
Пользуйтесь...
UPD добавил расшифровку погодных условий
Нужно получить ключ 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%
-
- Сообщения: 407
- Зарегистрирован: Вт окт 24, 2017 2:01 pm
- Откуда: Ижевск
- Благодарил (а): 45 раз
- Поблагодарили: 69 раз
Re: [Модуль] Погода Яндекс (yandexweather)
у меня не заработал. ключ ввел, координаты тоже и ничего
Код: Выделить всё
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