Небосвод

← На главную

Как пользоваться Небосводом

Небосвод — это погодный сервис, который отдаёт данные в формате 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")

Свои города и порядок плиток

Если зарегистрироваться в сервисе (кнопка входа на главной), можно выбрать, какие города показывать, и задать их порядок. Настройки хранятся за вами и не меняются у других.

Важные мелочи