Горячая линия Embedded System Rus:8-800-775-06-34 (звонок по России бесплатный)

LM5_N
LM-Wall_N
DALI_N
Vita_N

Получение прогноза погоды с Apixu.com

Для получения прогноза погоды с сервиса Apixu.com Вам нужно:

  1. Зарегистрировать бесплатный аккаунт на сайте https://www.apixu.com/ . По завершении регистрации вы получите API key, который будет использован далее.
  2. Создать групповые адреса для значений прогноза погоды.
    Запустите следующий код один раз из любого скрипта, например, из скрипта по расписанию.
    Зайдите во вкладку Scripting, нажмите кнопку Scheduled, в левом нижнем углу экрана нажмите Add new script.
    Заполнение полей для данного скрипта не имеет особой важности, необходимо лишь поставить галочку Active. Затем зайти в редактор скрипта, скопировать ниже следующий код, нажать кнопку Save, нажать кнопку Run script. По завершении выполнения скрипт выключится и больше не будет запускаться.
    -- при необходимости скорректируйте тип данных
    base_adr = '33/0/'
    weather_obj = {
    { name = 'current.temp_c',
    datatype = 'temperature',
    units = '°C'},
    { name = 'current.feelslike_c',
    datatype = 'temperature',
    units = '°C'},
    { name = 'current.humidity',
    datatype = 'scale',
    units = '%'},
    { name = 'current.wind_kph',
    datatype = 'float16',
    units = ' км/ч'},
    { name = 'current.uv',
    datatype = 'uint16'},
    { name = 'current.condition.text',
    datatype = 'text'},
    { name = 'current.pressure_mb',
    datatype = 'float16',
    units = ' мБар'},
    { name = 'current.precip_mm',
    datatype = 'uint16',
    units = ' мм'},
    { name = 'today.mintemp_c',
    datatype = 'temperature',
    units = '°C'},
    { name = 'today.maxtemp_c',
    datatype = 'temperature',
    units = '°C'},
    { name = 'today.avgtemp_c',
    datatype = 'temperature',
    units = '°C'},
    { name = 'today.avghumidity',
    datatype = 'scale',
    units = '%'},
    { name = 'today.maxwind_kph',
    datatype = 'float16',
    units = ' км/ч'},
    { name = 'today.uv',
    datatype = 'uint16'},
    { name = 'today.condition.text',
    datatype = 'text'},
    { name = 'today.totalprecip_mm',
    datatype = 'uint16',
    units = ' мм'},
    { name = 'tomorrow.mintemp_c',
    datatype = 'temperature',
    units = '°C'},
    { name = 'tomorrow.maxtemp_c',
    datatype = 'temperature',
    units = '°C'},
    { name = 'tomorrow.avgtemp_c',
    datatype = 'temperature',
    units = '°C'},
    { name = 'tomorrow.avghumidity',
    datatype = 'scale',
    units = '%'},
    { name = 'tomorrow.maxwind_kph',
    datatype = 'float16',
    units = ' км/ч'},
    { name = 'tomorrow.uv',
    datatype = 'uint16'},
    { name = 'tomorrow.condition.text',
    datatype = 'text'},
    { name = 'tomorrow.totalprecip_mm',
    datatype = 'uint16',
    units = ' мм'},}for i = 1, #weather_obj, 1 do
    obj = weather_obj[i]
    if obj.units then
    units = obj.units
    else
    units = ''
    end
    grp.create(
    {
    datatype = obj.datatype,
    address = base_adr..i,
    name = obj.name,
    units = units
    }
    )
    end
    script.disable(_SCRIPTNAME)

    В переменной base_adr вы можете поменять «основу» адреса.
    Результатом работы скрипта будет следующее:
  3. Создать скрипт по расписанию, например, с такими параметрами:
    В данном примере скрипт будет запрашивать прогноз раз в 10 минут. Убедитесь, что скрипт не выполняется слишком часто (не более 1 раза в 5 минут).
  4. Вставить следующий код в редактор скрипта.
    Переменной key присвоить значение вашего API key, а также поменять значение переменной location на название необходимой локации в виде строкового значения.
    Например, город Королёв Московской области можно найти на сайте так:

    location будет иметь значение ‘korolev-moskva-russia’.
    При необходимости поменяйте групповые адреса, в которые будет осуществляться запись значений прогноза. Со всей информацией прогноза можно ознакомиться в документации по ссылке: https://www.apixu.com/doc/forecast.aspx
    require('json')
    https = require('ssl.https')
    escape = require('socket.url').escape
    key = 'my_api_key'
    location = 'my location name'
    url = 'https://api.apixu.com/v1/forecast.json?key=%s&q=%s&days=2&lang=ru'
    url = string.format(url, key, escape(location))
    res = https.request(url)data = json.pdecode(res)
    if type(data) ~= 'table' then
    alert('failed to load weather data')
    return
    end
    if data.error then
    log('error', data.error)
    return
    end
    current = data.current
    today = data.forecast.forecastday[ 1 ].day
    tomorrow = data.forecast.forecastday[ 2 ].day
    -- log(current, today, tomorrow)-- temperature in C
    grp.write('current.temp_c', current.temp_c)
    -- "feels like" temperature in C
    grp.write('current.feelslike_c', current.feelslike_c)
    -- humidity as percentage
    grp.write('current.humidity', current.humidity)
    -- wind speed in kilometers per hour
    grp.write('current.wind_kph', current.wind_kph)
    -- uv index
    grp.write('current.uv', current.uv)
    -- weather condition text
    grp.write('current.condition.text', current.condition.text)
    -- pressure in millibars
    grp.write('current.pressure_mb', current.pressure_mb)
    -- precipitation amount in millimeters
    grp.write('current.precip_mm', current.precip_mm)
    -- minimum temperature in celsius for the day
    grp.write('today.mintemp_c', today.mintemp_c)
    -- maximum temperature in celsius for the day
    grp.write('today.maxtemp_c', today.maxtemp_c)
    -- average temperature in celsius for the day
    grp.write('today.avgtemp_c', today.avgtemp_c)
    -- average humidity as percentage
    grp.write('today.avghumidity', today.avghumidity)
    -- maximum wind speed in kilometers per hour
    grp.write('today.maxwind_kph', today.maxwind_kph)
    -- uv index
    grp.write('today.uv', today.uv)
    -- weather condition text
    grp.write('today.condition.text', today.condition.text)
    -- total precipitation in millimeters
    grp.write('today.totalprecip_mm', today.totalprecip_mm)
    -- minimum temperature in celsius for the day
    grp.write('tomorrow.mintemp_c', tomorrow.mintemp_c)
    -- maximum temperature in celsius for the day
    grp.write('tomorrow.maxtemp_c', tomorrow.maxtemp_c)
    -- average temperature in celsius for the day
    grp.write('tomorrow.avgtemp_c', tomorrow.avgtemp_c)
    -- average humidity as percentage
    grp.write('tomorrow.avghumidity', tomorrow.avghumidity)
    -- maximum wind speed in kilometers per hour
    grp.write('tomorrow.maxwind_kph', tomorrow.maxwind_kph)
    -- uv index
    grp.write('tomorrow.uv', tomorrow.uv)
    -- weather condition text
    grp.write('tomorrow.condition.text', tomorrow.condition.text)
    -- total precipitation in millimeters
    grp.write('tomorrow.totalprecip_mm', tomorrow.totalprecip_mm)

 

Готово!

Данные прогноза погоды находятся в групповых адресах.

Рассмотрим примеры использования этих данных.

По текущей скорости ветра можно активировать «защиту от ветра». Для этого поможет событийный скрипт, запускающийся по объекту текущей скорости ветра.

  1. Зайдите во вкладку Scripting.
  2. Нажмите кнопку Event-based.
  3. В левом нижнем углу экрана нажмите Add new script.
  4. В поле Group address / tag укажите групповой адрес текущей скорости ветра.
    В нашем случае это адрес 33/0/4.
  5. Установите галочку Active:

  6. В редакторе скрипта вставьте следующий код:
    -- скорость ветра указывается в км/ч
    -- критическая скорость при превышении которой нужно включать защиту от ветра
    critical_speed = 40 -- поправьте значение на необходимое Вам
    --безопасная скорость, при которой можно отключить защиту
    safe_speed = 10
    -- получаем текущую скорость из прогноза,
    cur_speed = event.getvalue()
    -- сравниваем
    if cur_speed > critical_speed then
    -- активируем защиту
    grp.write('объект защиты от ветра', true)
    elseif cur_speed < safe_speed then
    -- отключаем защиту
    grp.write('объект защиты от ветра', false)
    end

Конечно, Вам потребуется еще групповой адрес «защиты от ветра» и, возможно, скрипт, совершающий определенные действия, при необходимости.

По текущей температуре, минимальной температуре в течении дня и количеству осадков в течении дня можно включать системы антиобледенения. Для решения этой задачи нам также потребуется событийный скрипт. В этот раз создайте его для группового адреса текущей температуры. В нашем примере это адрес 33/0/1

current_temp_c = grp.getvalue('current.temp_c')
today_mintemp_c = grp.getvalue('today.mintemp_c')
today_totalprecip_mm = grp.getvalue('today.totalprecip_mm')
if current_temp_c < 2 and today_mintemp_c < 0 and today_totalprecip_mm > 0 then
grp.write('антиобледенитель', true)
end

 

Также вы можете отобразить данный прогноза на экране визуализации.

По ссылке вы можете скачать бэкап виджета визуализации.

Скачать архив виджета

Выглядеть он будет следующим образом:

Для импорта данного виджета в Вашу визуализацию Вам нужно сделать следующее:

  1. Выбрать вкладку Vis. structure.
  2. Выбрать подвкладку Layouts / Widjets.
  3. В строке папки Widjets нажать на зеленый «+».
  4. В появившемся окне нажать Import.
  5. Указать путь к скачанному файлу.
  6. Добавить на необходимую страницу иконку, по которой будет открываться виджет.
  7. В параметрах иконки в поле Widjet выбрать импортированный виджет Apixu.