Яндекс Погода в Zabbix через http агента

Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 856
Стаж: 5 лет 8 месяцев
Откуда: Вологодская область
Поблагодарили: 37 раз
Контактная информация:

Яндекс Погода в Zabbix через http агента

Сообщение Артём Мамзиков »

Данный шаблон будет больше примером как работает http агент в заббикс и пример предварительной обработки регулярными выражениями. Из полезного возможно будет: триггер на грозу в том или ином место положении начинается гроза дать команду на выключение какого либо оборудования, триггер на жару сокращение рабочего дня. И так посмотреть графики например пик влажности самый большой и меленький за неделю в какое время, график давления, температуры как это все друг на друге отображается и как строится прогнозирование.

В начале нужно получить ключ API Яндекс погоды в кабинете разработчика для запроса погоды, бесплатный тариф погода на вашем сайте 50 запросов в сутки получаем 48 запросов 1раз в 30 минут для одного города.
Кабинет разработчика Яндекс погоды
Кабинет разработчика Яндекс погоды
Тут же получаем Что есть что, вид запроса и т.д.
Яндекс погода API
Яндекс погода API
Пример через Curl для Linux

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

curl -X GET --header "X-Yandex-API-Key: 5e2fe4f9-r1cd-4a29-9995-fr95qb4a4f58" https://api.weather.yandex.ru/v2/informers?lat=59.954507&lon=40.210775&lang=ru_RU
Если все хорошо получаем ответ одной строкой
Ответ Api Яндекс Погода
Показать
{"now":1662397751,"now_dt":"2022-09-05T17:09:11.987912Z","info":{"url":"https://yandex.ru/pogoda/20125?lat=59.9 ... 13","parts":[{"part_name":"night","temp_min":5,"temp_avg":5,"temp_max":6,"wind_speed":1.9,"wind_gust":5,"wind_dir":"nw","pressure_mm":747,"pressure_pa":995,"humidity":90,"prec_mm":0,"prec_prob":0,"prec_period":480,"icon":"ovc","condition":"overcast","feels_like":2,"daytime":"n","polar":false},{"part_name":"morning","temp_min":5,"temp_avg":7,"temp_max":9,"wind_speed":2.4,"wind_gust":5.6,"wind_dir":"nw","pressure_mm":746,"pressure_pa":994,"humidity":89,"prec_mm":0.3,"prec_prob":20,"prec_period":360,"icon":"ovc_-ra","condition":"light-rain","feels_like":4,"daytime":"d","polar":false}]}}

СКАЧАТЬ
Яндекс погода.zip
Яндекс погода.zip
(17.14 КБ) 69 скачиваний
Переходим к созданию шаблона в заббикс

Создадим макросы чтоб на разных городах можно было менять координаты и ключ API
Яндекс погода Макросы
Яндекс погода Макросы
Задаем свои значения
{$LAT} = значение северной широты
{$LON} = значение восточной долготы
{$WEATHER_APIKEY} = ключ API
{$WEATHER_LANG} = Язык

Создаем основной элемент данных в заббикс который будет получать данные о погоде
Элемент данных Запрос Яндекс погоды через HTTP агента Zabbix
Элемент данных Запрос Яндекс погоды через HTTP агента Zabbix
Имя: Запрос Погоды
Тип: HTTP агент
Ключ: get_weather.https
URL: https://api.weather.yandex.ru/v2/informers
Поля запроса:
lat => {$LAT}
lon => {$LON}
lang => {$WEATHER_LANG}
Тип запроса: GET
Время ожидания: 15s
Типа запроса тела: Сырые данные
Запрос тела:
Заголовки: X-Yandex-API-Key => {$WEATHER_APIKEY}
Требуемые коды состояния: 200
Следовать перенаправлениям: V
Режим получения: Тело
Тип информации: Текст
Интервал обновления: 30m

Пример последних данных:
Яндекс погода пример последних данных одной строкой
Яндекс погода пример последних данных одной строкой
В начале получаем техническую информацию время дату координаты ссылку, далее строка фактической погоды и 2 строки прогнозируемой погоды на 2 периода суток.

Разбираем все данные по элементам.
Создаем зависимые элементы данных и регулярное выражение для получения значения. (ps JSONPath у меня на 4.2.1 корректно не работает поэтому регуляркой)

Примеры регулярок
([0-9]+) - целое число
([0-9]+.[0-9]+) - число с точкой или без но минимум 3х значное иначе ошибка
([0-9.]+) - Число с точкой(ами) или без точки может быть 1 значное число

Минимальная температура Утро
morning","temp_min":([0-9.]+),"temp_avg

2 строки с одинаковым содержимым кроме первого слова (утро день вечер ночь) строка может быть первой или последней
Можно делать так указывая начало строки и жестко всю строку (если где то указать .* получи данные последней строки)
morning","temp_min":([0-9.]+),"temp_avg
Но тут есть ограничение длина строки регулярного выражения например полярный день или нет уже не влезет
morning","temp_min":[0-9.]+,"temp_avg":[0-9.]+,"temp_max":[0-9.]+,"wind_speed":[0-9.]+,"wind_gust":[0-9.]+,"wind_dir":"[A-z-]+","pressure_mm":[0-9.]+,"pressure_pa":[0-9.]+,"humidity":[0-9.]+,"prec_mm":[0-9.]+,"prec_prob":[0-9.]+,"prec_period":[0-9.]+,"icon":"[A-z-_]+","condition":"[A-z-]+","feels_like":[0-9.]+,"daytime":"[A-z-]+","polar":([A-z-]+)

И что делать?
если водной строке одинаковые слова и строки меняются местами может быть 1 а может быть 2
Обрезать до первого совпадения, а не последнего

Regex: соответствие до первого вхождения символа
[^;] или экранирован /[^;]*/
заключив список символов в [], который будет соответствовать любому символу из списка. Если первым символом После " ["является"^", класс соответствует любому символу, не включенному в список.
получаем значение до первой ;
morning"[^}]*polar":([A-z-]+)

? ленивый оператор, поэтому регулярное выражение захватывает как можно меньше перед сопоставлением ;.
.*?

Рассмотрим разницу
morning".*polar":([A-z-]+) - берется последняя строка не правильно для нас
morning".*?polar":([A-z-]+) - правильно
morning"[^}]*polar":([A-z-]+) - правильно
Вывод \1
Пример предобработки
Пример предобработки
еще пример значение 0.256987 (0 - часы . минуты )
([0-9]+).([0-9][0-9]) вывод \1:\2
Получаем 0:25

вывод - шаблон форматирования вывода. \N (где N=1..9) - управляющая последовательность заменяется N-нной совпадающей группой. Управляющая последовательность \0 заменяется совпадающим текстом.

В интернете очень много примеров по регуляркам, в некоторых случаях не забывайте экранировать спец символы.

Для тестов регулярных выражений можно использовать сайт regex101 в настройках можно включить Русский
Пример регулярного выражения неправильный
Пример регулярного выражения неправильный
Пример регулярного выражения правильный
Пример регулярного выражения правильный
Пример регулярного выражения правильный2
Пример регулярного выражения правильный2
В элементах используются разные варианты регулярок более длинные и короткие более универсальные.


Далее для некоторых элементов данных создадим преобразования.
Преобразования Zabbix Яндекс погода
Преобразования Zabbix Яндекс погода
Яндекс Погода Время Суток
day ⇒ День
day-evening ⇒ День и Вечер
evening ⇒ Вечер
evening-night ⇒ Вечер и Ночь
morning ⇒ Утро
morning-day ⇒ Утро и День
night ⇒ Ночь
night-morning ⇒ Ночь и Утро

Яндекс Погода Время Суток Темное-Светлое
d ⇒ Светлое время суток
n ⇒ Темное время суток

Яндекс Погода Время года
autumn ⇒ Осень
spring ⇒ Весна
summer ⇒ Лето
winter ⇒ Зима

Яндекс Погода Направление ветра
c ⇒ Штиль
e ⇒ Восточное
n ⇒ Северное
ne ⇒ Северо-Восточное
nw ⇒ Северо-Западное
s ⇒ Южное
se ⇒ Юго-Восточное
sw ⇒ Юго-Западное
w ⇒ Западное

Яндекс Погода Полярный День
false ⇒ Нет
true ⇒ Да

Яндекс Погода Фаза Луны
0 ⇒ Полнолуние
1 ⇒ Убывающая Луна
2 ⇒ Убывающая Луна
3 ⇒ Убывающая Луна
4 ⇒ Последняя четверть
5 ⇒ Убывающая Луна
6 ⇒ Убывающая Луна
7 ⇒ Убывающая Луна
8 ⇒ Новолуние
9 ⇒ Растущая Луна
10 ⇒ Растущая Луна
11 ⇒ Растущая Луна
12 ⇒ Первая четверть
13 ⇒ Растущая Луна
14 ⇒ Растущая Луна
15 ⇒ Растущая Луна

Яндекс Погода Фаза Луны Текстом
moon-code-0 ⇒ Полнолуние
moon-code-1 ⇒ Убывающая Луна
moon-code-2 ⇒ Убывающая Луна
moon-code-3 ⇒ Убывающая Луна
moon-code-4 ⇒ Последняя четверть
moon-code-5 ⇒ Убывающая Луна
moon-code-6 ⇒ Убывающая Луна
moon-code-7 ⇒ Убывающая Луна
moon-code-8 ⇒ Новолуние
moon-code-9 ⇒ Растущая Луна
moon-code-10 ⇒ Растущая Луна
moon-code-11 ⇒ Растущая Луна
moon-code-12 ⇒ Первая четверть
moon-code-13 ⇒ Растущая Луна
moon-code-14 ⇒ Растущая Луна
moon-code-15 ⇒ Растущая Луна

Яндекс Погодные условия
clear ⇒ Ясно
cloudy ⇒ Облачно с прояснениями
drizzle ⇒ Морось
hail ⇒ Град
light-rain ⇒ Небольшой дождь
light-snow ⇒ Небольшой снег
moderate-rain ⇒ Умеренно сильный дождь
overcast ⇒ Пасмурно
partly-cloudy ⇒ Малооблачно
rain ⇒ Дождь
showers ⇒ Ливень
snow ⇒ Снег
snow-showers ⇒ Снегопад
thunderstorm ⇒ Гроза
thunderstorm-with-hail ⇒ Гроза с градом
thunderstorm-with-rain ⇒ Дождь с грозой
wet-snow ⇒ Дождь со снегом

Создаем по максимуму все возможные элементы.

Для удобства разделим на группы
Группы Яндекс погоды
Группы Яндекс погоды
Фактическая погода Элементы данных 22
Погода Утро Элементы данных 17
Погода Ночь Элементы данных 17
Погода День Элементы данных 17
Погода Вечер Элементы данных 17
Погода Элементы данных 97

Элемента данных Фактическая погода
Элементы данных фактическая погода Яндекс погоды
Элементы данных фактическая погода Яндекс погоды
Запрос Погоды: Код фазы Луны moon_code 90d 365d Зависимый элемент данных Погода, Фактическая погода Активировано

Запрос Погоды: Атмосферное давление фактическое pressure_mm 90d 90d Зависимый элемент данных Погода, Фактическая погода Активировано

Запрос Погоды: Время восхода Солнца sunrise 90d Зависимый элемент данных Погода, Фактическая погода Активировано

Запрос Погоды: Порядковый номер недели. week 90d 90d Зависимый элемент данных Погода, Фактическая погода Активировано

Запрос Погоды: Дата прогноза unix date_ts 90d 90d Зависимый элемент данных Погода, Фактическая погода Активировано

Запрос Погоды: Страница населенного пункта на сайте Яндекс Погода url 90d Зависимый элемент данных Погода, Фактическая погода Активировано

Запрос Погоды: Время года фактическое season 90d Зависимый элемент данных Погода, Фактическая погода Активировано

Запрос Погоды: Время полярное? polar 90d Зависимый элемент данных Погода, Фактическая погода Активировано

Запрос Погоды: Время суток фактическое daytime 90d Зависимый элемент данных Погода, Фактическая погода Активировано

Запрос Погоды: Атмосферное давление гПа фактическое pressure_pa 90d 90d Зависимый элемент данных Погода, Фактическая погода Активировано

Запрос Погоды: Направление ветра фактическое wind_dir 90d Зависимый элемент данных Погода, Фактическая погода Активировано

Запрос Погоды: Скорость порывов ветра фактическое wind_gust 90d 90d Зависимый элемент данных Погода, Фактическая погода Активировано

Запрос Погоды: Температура воды фактическое temp_water 90d 90d Зависимый элемент данных Погода, Фактическая погода Активировано

Запрос Погоды: Погодное условие фактическое Триггеры 1 condition 90d Зависимый элемент данных Погода, Фактическая погода Активировано

Запрос Погоды: Скорость ветра фактическая wind_speed 90d 90d Зависимый элемент данных Погода, Фактическая погода Активировано

Запрос Погоды: Географическое положение города, широта lat 90d 90d Зависимый элемент данных Погода, Фактическая погода Активировано

Запрос Погоды: Географическое положение города, долгота lon 90d 90d Зависимый элемент данных Погода, Фактическая погода Активировано

Запрос Погоды: Время замера погодных данных obs_time 90d 90d Зависимый элемент данных Погода, Фактическая погода Активировано

Запрос Погоды: Ощущаемая температура фактическая feels_like 90d 90d Зависимый элемент данных Погода, Фактическая погода Активировано

Запрос Погоды: Влажность воздуха % фактическое humidity 90d 90d Зависимый элемент данных Погода, Фактическая погода Активировано

Запрос Погоды: Температура фактическая Триггеры 1 temp 90d 90d Зависимый элемент данных Погода, Фактическая погода Активировано

Запрос Погоды: Время заката Солнца sunset 90d Зависимый элемент данных Погода, Фактическая погода Активировано


Погода прогнозируемая не постоянная так как из 4 доступно только по 2 , зависимый элемент по времени работы настроить нельзя.
На примере Утро аналогично для День, Вечер, Ночь
Элементы данных Утро погода Яндекс погоды
Элементы данных Утро погода Яндекс погоды
Запрос Погоды: Минимальная температура Утро morning.temp_min 90d 90d Зависимый элемент данных Погода, Погода Утро Активировано

Запрос Погоды: Прогнозируемое количество осадков Утро morning.prec_mm 90d 90d Зависимый элемент данных Погода, Погода Утро Активировано

Запрос Погоды: Время суток Утро morning.daytime 90d Зависимый элемент данных Погода, Погода Утро Активировано

Запрос Погоды: Ощущаемая температура Утро morning.feels_like 90d 90d Зависимый элемент данных Погода, Погода Утро Активировано

Запрос Погоды: Погодное Условие Утро morning.condition 90d Зависимый элемент данных Погода, Погода Утро Активировано

Запрос Погоды: Код иконки погоды Утро morning.icon 90d Зависимый элемент данных Погода, Погода Утро Активировано

Запрос Погоды: Прогнозируемый период осадков Утро morning.prec_period 90d 90d Зависимый элемент данных Погода, Погода Утро Активировано

Запрос Погоды: Вероятность выпадения осадков Утро morning.prec_prob 90d 90d Зависимый элемент данных Погода, Погода Утро Активировано

Запрос Погоды: Влажность воздуха Утро morning.humidity 90d 90d Зависимый элемент данных Погода, Погода Утро Активировано

Запрос Погоды: Максимальная температура Утро morning.temp_max 90d 90d Зависимый элемент данных Погода, Погода Утро Активировано

Запрос Погоды: Давление (в гектопаскалях) Утро morning.pressure_pa 90d 90d Зависимый элемент данных Погода, Погода Утро Активировано

Запрос Погоды: Давление (в мм рт. ст.). Утро morning.pressure_mm 90d 90d Зависимый элемент данных Погода, Погода Утро Активировано

Запрос Погоды: Направление ветра Утро morning.wind_dir 90d Зависимый элемент данных Погода, Погода Утро Активировано

Запрос Погоды: Скорость порывов ветра (в м/с). Утро morning.wind_gust 90d 90d Зависимый элемент данных Погода, Погода Утро Активировано

Запрос Погоды: Скорость ветра (в м/с). Утро morning.wind_speed 90d 90d Зависимый элемент данных Погода, Погода Утро Активировано

Запрос Погоды: Средняя температура Утро morning.temp_avg 90d 90d Зависимый элемент данных Погода, Погода Утро Активировано

Запрос Погоды: Полярный день? Утро morning.polar 90d Зависимый элемент данных Погода, Погода Утро Активировано


Другие данные:
Запрос Погоды Триггеры 1 get_weather.https 30m 90d HTTP агент Погода Активировано

Запрос Погоды: Дата прогноза date 90d Зависимый элемент данных Погода Активировано

Запрос Погоды: Время сервера Яндекс UTC на момент запроса now_dt 90d Зависимый элемент данных Погода Активировано

Запрос Погоды: Время сервера Яндекс на момент запроса now 90d 90d Зависимый элемент данных Погода Активировано

Запрос Погоды: Код иконки погоды фактический icon 90d Зависимый элемент данных Погода Активировано

Запрос Погоды: Прогнозируемая погода 2х времени суток part_name 90d Зависимый элемент данных Погода Активировано

Запрос Погоды: Текстовый код для фазы Луны moon_text 90d Зависимый элемент данных Погода Активировано


Триггеры
Триггеры Яндекс погоды
Триггеры Яндекс погоды
Информационная Ошибка запроса погоды {info-weather-Yandex:get_weather.https.iregexp(forbidden)}=1 or {info-weather-Yandex:get_weather.https.iregexp(403)}=1 Активировано

Информационная Яндекс Гроза {info-weather-Yandex:condition.iregexp(thunderstorm)}=1 or {info-weather-Yandex:condition.iregexp(Гроза)}=1 Активировано

Информационная Яндекс Жара :) {info-weather-Yandex:temp.last()}>=30 Активировано

Графики
Графики Яндекс погоды
Графики Яндекс погоды
Температура фактическая и средняя 900 200 Нормальный
Температура Ощущаемая 900 200 Нормальный
Температура Минимальная - Максимальная 900 200 Нормальный
Скорость ветра порывы м/с 900 200 Нормальный
Осадки 900 200 Нормальный
Давление в мм рт. ст. 900 200 Нормальный
Давление в гПа 900 200 Нормальный
Влажность Воздуха % 900 200 Нормальный

Комплексные экраны 1
Погода Яндекс
Пример последних данных Фактическая Яндекс погода
Пример последних данных Фактическая Яндекс погода
Пример последних данных Яндекс погоды
Пример последних данных Яндекс погоды
Пример Графиков Яндекс погода
Пример Графиков Яндекс погода
количество слов: 703
barakov
Гость
Сообщения: 1
Стаж: 2 года 4 месяца

Яндекс Погода в Zabbix через http агента

Сообщение barakov »

не работает с отрицательными температурами
сможете поправить?
количество слов: 0
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 856
Стаж: 5 лет 8 месяцев
Откуда: Вологодская область
Поблагодарили: 37 раз
Контактная информация:

Яндекс Погода в Zabbix через http агента

Сообщение Артём Мамзиков »

barakov,как то я упустил - было в регулярках ([0-9]+) стало ([0-9-]+), шаблон перезалит
количество слов: 5
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 856
Стаж: 5 лет 8 месяцев
Откуда: Вологодская область
Поблагодарили: 37 раз
Контактная информация:

Яндекс Погода в Zabbix через http агента

Сообщение Артём Мамзиков »

Подскажите, как избавиться от первичных значений в скобках?
убрать первые значения
убрать первые значения
так работает преобразование , можешь убрать преобразование в элементе и сделать пред обработку заменой слов

вдруг, кому-то потребуется )
главное не забыть отключить преобразование значений в элементе данных

поправил (фактические погодные условия и направление ветра)
Вариант правки
Показать
const windDirectionMapping = {
"nw": "Северо-западное",
"n": "Северное",
"ne": "Северо-восточное",
"e": "Восточное",
"se": "Юго-восточное",
"s": "Южное",
"sw": "Юго-западное",
"w": "Западное",
"c": "Штиль"
};

const windDirectionValueMatch = value.match(/fact":.*wind_dir":"([A-z-]+).*forecast/);

if (windDirectionValueMatch && windDirectionValueMatch[1]) {
const windDirectionValue = windDirectionValueMatch[1];
const transformedWindDirection = windDirectionMapping[windDirectionValue] || "Неизвестное направление ветра";
return transformedWindDirection;
} else {
return "Неизвестное направление ветра";
}
const conditionMapping = {
"clear": "Ясно",
"cloudy": "Облачно с прояснениями",
"drizzle": "Морось",
"hail": "Град",
"light-rain": "Небольшой дождь",
"light-snow": "Небольшой снег",
"moderate-rain": "Умеренно сильный дождь",
"overcast": "Пасмурно",
"partly-cloudy": "Малооблачно",
"rain": "Дождь",
"showers": "Ливень",
"snow": "Снег",
"snow-showers": "Снегопад",
"thunderstorm": "Гроза",
"thunderstorm-with-hail": "Гроза с градом",
"thunderstorm-with-rain": "Дождь с грозой",
"wet-snow": "Дождь со снегом"
};

const conditionValueMatch = value.match(/fact":.*condition":"([A-z-]+).*forecast/);

if (conditionValueMatch && conditionValueMatch[1]) {
const conditionValue = conditionValueMatch[1];
const transformedValue = conditionMapping[conditionValue] || "Неизвестное условие";
return transformedValue;
} else {
return "Неизвестное условие";
}
замена
замена
пример погода
пример погода
количество слов: 91
Ответить Вложения 22 Пред. темаСлед. тема

Вернуться в «Прочие различные шаблоны»