Как пользоваться Небосводом
Небосвод — это погодный сервис, который отдаёт данные в формате JSON. Формат этот читают и люди, и программы: скрипты, автоматизации, умный дом. Ниже — простой разбор, без технического жаргона.
Как получить погоду
Откройте адрес погоды — и получите ответ. Например, погода в Екатеринбурге:
{{BASE}}/api/weather?city=ekb
В ответе будет три блока: current — погода сейчас (температура, влажность, ветер, облачность, осадки), daily — на день (максимум/минимум, рассвет, закат, вероятность осадков), nightly — на ночь. Рядом лежат единицы измерения — что чем меряется.
Город можно указать коротким именем (alias) — например
ekb, tyumen, is — или
числовым city_id.
Готовая ссылка на город. Откройте карточку города (кликните по ней), и там будет строка «ID города» — сам ID является ссылкой. Кликните по нему, и полная ссылка API на этот город скопируется в буфер обмена. Останется только вставить её в браузер, скрипт или умный дом.
Список городов
Все города, которые умеет сервис, отдаёт этот адрес:
{{BASE}}/api/all-cities
В списке у каждого города: имя, короткое имя (alias), широта,
долгота и часовой пояс. Этот же список отдаёт
{{BASE}}/api/cities.
Удобно использовать в автоматизациях: один раз получить список городов, а дальше опрашивать только нужные. Подойдёт и людям — чтобы посмотреть, какие города уже добавлены в сервис.
Несколько городов одним запросом
Если нужно получить погоду сразу для многих городов, не обязательно делать отдельный запрос на каждый. Перечислите ID через запятую:
{{BASE}}/api/weather?city_ids=524901,1486209,1488754
В ответе придёт объект results, где ключ — ID города, а значение — та же погода, что и в обычном ответе. Если по какому-то городу данных нет, его ID попадёт в список missing.
Так сервис работает заметно быстрее и бережнее: вместо десятков отдельных запросов — один. Именно этим способом пользуется сама главная страница сервиса.
{
"results": {
"524901": { "name": "Москва", "current": { ... } },
"1486209": { "name": "Екатеринбург", "current": { ... } }
},
"missing": []
}
Умный дом и автоматизации
Сервис не требует пароля для чтения погоды — можно просто запрашивать адрес из любой системы. Вот как это делается в самых популярных местах.
Home Assistant
Добавьте в configuration.yaml «датчик по REST» —
Home Assistant сам будет опрашивать сервис и покажет температуру
как обычный сенсор:
sensor:
- platform: rest
name: "Небосвод Екатеринбург"
resource: "{{BASE}}/api/weather?city=ekb"
value_template: "{{ value_json.current.temperature }}"
unit_of_measurement: "°C"
scan_interval: 900
Так же можно вытащить влажность
(value_json.current.humidity), ветер
(value_json.current.wind_speed) или давление
(value_json.current.pressure_mmhg).
Node-RED
Узел HTTP Request на адрес погоды — и дальше парсите
ответ как обычный JSON. Температура будет в
msg.payload.current.temperature.
MajorDoMo
Рабочий пример метода getWeather для MajorDoMo —
обновляет свойства устройства погодой из сервиса:
$url = "{{BASE}}/api/weather?city_id=".$this->getProperty('city_id');
$raw = getURL($url, 0);
$data = json_decode($raw, true);
$this->setProperty("sunrise", $data['daily']['sunrise']);
$this->setProperty("sunset", $data['daily']['sunset']);
$this->setProperty("current_temp", round($data['current']['temperature']));
$this->setProperty("current_feels_like", round($data['current']['feels_like']));
$this->setProperty("current_humidity", $data['current']['humidity']);
$this->setProperty("current_pressure", $data['current']['pressure_mmhg']);
$this->setProperty("current_wind_speed", round($data['current']['wind_speed'], 1));
$this->setProperty("current_wind_dir", $data['current']['wind_direction']);
$this->setProperty("current_condition", $data['current']['condition']);
$this->setProperty("daily_temp_max", round($data['daily']['temp_max']));
$this->setProperty("daily_temp_min", round($data['daily']['temp_min']));
$this->setProperty("daily_wind_speed_max", round($data['daily']['wind_speed_max'], 1));
$this->setProperty("daily_wind_dir_dominant", $data['daily']['wind_direction_dominant']);
$this->setProperty("daily_condition", $data['daily']['condition']);
$this->setProperty("nightly_temp_max", round($data['nightly']['temp_max']));
$this->setProperty("nightly_temp_min", round($data['nightly']['temp_min']));
$this->setProperty("nightly_wind_speed_max", $data['nightly']['wind_speed_max']);
$this->setProperty("nightly_wind_dir_dominant", $data['nightly']['wind_direction_dominant']);
$this->setProperty("nightly_condition", $data['nightly']['condition']);
Любой скрипт
Например, на bash:
curl -s "{{BASE}}/api/weather?city=ekb" \
| python3 -c "import sys,json; d=json.load(sys.stdin); \
print(d['current']['temperature'], '°C')"
Или на Python:
import json, urllib.request
with urllib.request.urlopen(
"{{BASE}}/api/weather?city=ekb") as r:
d = json.load(r)
print(d["current"]["temperature"], "°C")
Свои города и порядок плиток
Если зарегистрироваться в сервисе (кнопка входа на главной), можно выбрать, какие города показывать, и задать их порядок. Настройки хранятся за вами и не меняются у других.
- В настройках отметьте нужные города — остальные можно скрыть или показывать в конце списка.
- Там же, в блоке «Порядок плиток», стрелками ↑ и ↓ расставьте города так, как вам удобно — так они и будут показаны на главной.
- Порядок сохраняется на сервере и не сбивается после перезагрузки страницы.
Важные мелочи
- Адрес сервиса подставляется в примеры автоматически — он совпадает с адресом этой страницы. Если сервис переедет на доменное имя, примеры обновятся сами.
- Данные кэшируются — сервис не дёргает внешний источник каждую секунду. Обновление происходит примерно раз в 20 минут.
- Кэш сохраняется на диск, поэтому после перезапуска сервиса страница открывается мгновенно — данные берутся из последних сохранённых. Сразу после запуска сервис в фоне обновляет все города до свежих, а дальше делает это регулярно сам.
- Если очень нужно свежее — добавьте
&refresh=1в конец адреса. - Если внешний источник погоды недоступен, сервис не оставляет пустые плитки: он отдаёт последние успешно полученные данные и помечает их как stale (устаревшие). Это же поле есть и в JSON-ответе.
- Код погоды — международный код WMO. Что он значит, легко найти по запросу «коды погоды WMO».
- Сервис домашний и бесплатный. Если он лежит — скорее всего, просто отключили электричество или сеть.