суббота, 7 апреля 2012 г.

О том как написать программу на lua для приема сводок погоды с любого сайта. Часть 4


Как вывести текст прогноза в окно conky.



В Части 2 и Части 3 мы выбрали доступные данные с сайта. Вот список доступных данных

Текущее состояние погоды

now["weather_icon"] -- иконка погоды
now["currentWeather"] -- состояние погоды
now["updated"] -- время последнего обновления
now["temp"] -- температура
now["wind_kmh"] -- скорость ветра в км/час
now["wind_ms"] -- скорость ветра в м/с
now["NESW"] -- направление ветра в системе NESW
now["wind_deg"] -- направление ветра в градусах
now["press_hPa"] -- давление в гектопаскалях
now["press_mm"] -- давление в миллиметрах ртутного столба
now["dewpoint"] -- точка росы, температура при которой возможен туман
now["feels_like"] -- ощущаемая температура
now["visibility"] -- видимость в км

Прогноз погоды на несколько дней

forecast_day[1] -- текущий день
weather_icon[1] -- иконка ожидаемой погоды на сегодня
high_temp[1] -- ожидаемая наивысшая температура на сегодня
low_temp[1] -- ожидаемая наименьшая температура на сегодня
forecastWeather[1] -- ожидаемое состояние погоды на сегодня

Для вывода необходимых нам текстовых данных на экран необходимо в конце скрипта, после закрывающего скрипт end добавить функцию вывода текста. Можно использовать написанный мной скрипт вывода простого текста. И дополнительно функцию перекодировки цвета

-- вывод текста
function display_text(t)

if t.text == nil then t.text = "Conky is good for you !" end
if t.x == nil then t.x = conky_window.width/2 end
if t.y == nil then t.y = conky_window.height/2 end
if t.colour == nil then t.colour = 0xff9000 end
if t.alpha == nil then t.alpha = 1 end
if t.font_name == nil then t.font_name = "Ubuntu" end
if t.font_size == nil then t.font_size = 14 end
if t.angle == nil then t.angle = 0 end
if t.italic == nil then t.italic = false end
if t.bold == nil then t.bold = false end
if t.h_align == nil then t.h_align = "l" end
if t.v_align == nil then t.v_align = "b" end

cairo_translate(cr, t.x, t.y)
cairo_rotate(cr, t.angle*math.pi/180)
-- настройка шрифта
local slant = CAIRO_FONT_SLANT_NORMAL
local weight =CAIRO_FONT_WEIGHT_NORMAL

if t.italic then slant = CAIRO_FONT_SLANT_ITALIC end
if t.bold then weight = CAIRO_FONT_WEIGHT_BOLD end

cairo_select_font_face(cr, t.font_name, slant, weight)

cairo_set_font_size(cr, t.font_size)

te=cairo_text_extents_t:create()
cairo_text_extents (cr,t.text,te)

cairo_set_source_rgba(cr, rgb_to_r_g_b(t.colour, t.alpha))
            
    mx,my=0,0
    
    if t.h_align=="c" then
        mx=-te.width/2
    elseif t.h_align=="r" then
        mx=-te.width
    end
    if t.v_align=="m" then
        my=-te.height/2-te.y_bearing
    elseif t.v_align=="t" then
        my=-te.y_bearing
    end
    cairo_move_to(cr,mx,my)
    cairo_show_text(cr,t.text)
end
-- функция перекодировки цвета
function rgb_to_r_g_b(colour,alpha)
return ((colour / 0x10000) % 0x100) / 255., ((colour / 0x100) % 0x100) / 255., (colour % 0x100) / 255., alpha
end

В начале нашего скрипта, выше названия функции function conky_forecast () добавляем функцию которая будет содержать все необходимые данные для размещения текста.

function conky_draw_text()
-- вызываем функцию погоды
conky_forecast()
-- здесь данные для вывода текста
text_settings={
-- температура
{text = now["temp"],
-- координата x
x = 120,
-- координата y
y = 95,
-- жирный текст, если убрать эту строку, то текст будет выведен нормальным шрифтом
bold = true,
-- размер шрифта
font_size = 24,
},
-- сюда добавляем блоки со следующими данными
}

--===================================================================
if conky_window == nil then return end
local cs = cairo_xlib_surface_create(conky_window.display, conky_window.drawable, conky_window.visual, conky_window.width, conky_window.height)
--====================================================================
-- выводим текст
for i,v in pairs(text_settings) do
cr = cairo_create (cs)
display_text(v)
cairo_destroy(cr)
end
end

Для запуска в conkyrc прописываем выше слова TEXT

lua_load ~/путь_до_скрипта/forecast.lua
lua_draw_hook_pre draw_text

Теперь руссифицмруем выводимые данные. Для этого надо в функцию forecast.lua добавить таблицу такого вида

-- перевод состояния погоды на русский язык
translate_eng_rus = {

["AM Snow Showers"] = "Утром снегопад",
["AM Light Snow"] = "Утром снег",
["Blowing Snow"] = "Поземка",
["Blustery"] = "Ветрено",
["Broken Clouds"] = "Временами облачно",
["Calm"] = "Штиль",
["Clear"] = "Ясно",
["Cloudy"] = "Облачно",
["Clouds Early"] = "Облачно",
["Drifting Snow"] = "Поземка",
["Drizzle"] = "Моросящий дождь",
["Dust"] = "Пыль",
["Fair"] = "Ясно",
["Few Clouds"] = "Небольшая облачность",
["Few Snow Showers"] = "Небольшой снегопад",
["Fog"] = "Густой туман",
["Freezing Drizzle"] = "Изморозь",
["Freezing Rain"] = "Леденой дождь",
["Hail"] = "Град",
["Haze"] = "Дымка",
["Heavy Rain"] = "Сильный дождь",
["Heavy Snow"] = "Сильный снег",
["High"] = "высокий",
["Hot"] = "Жара",
["Hurricane"] = "Ураган",
["Ice Pellets"] = "Леденая крупа",
["Isolated Thunderstorms"] = "Временами грозы",
["Light Fog"] = "Небольшой туман",
["Light Rain"] = "Небольшой дождь",
["Light Snow"] = "Небольшой снег",
["Light Snow Showers"] = "Сильный снегопад",
["Low"] = "низкий",
["Mixed Precipitation"] = "Смешанные осадки",
["Mixed Rain and Hail"] = "Дождь с градом",
["Mixed Rain and Sleet"] = "Дождь с мокрым снегом",
["Mixed Rain and Snow"] = "Дождь со снегом",
["Moderate Snow"] = "Умеренный снег",
["Mostly Clear"] = "Переменная облачность",
["Mostly Cloudy"] = "Переменная облачность",
["Mostly Sunny"] = "Преимуществеено солнечно",
["Overcast"] = "Облачно",
["Partly Cloudy"] = "Переменная облачность",
["PM Snow Showers"] = "Ночью снегопад",
["Rain"] = "Дождь",
["Rain Showers"] = "Ливни",
["Scattered Clouds"] = "Местами облачно",
["Scattered Showers"] = "Местами грозы",
["Scattered Snow Showers"] = "Местами снег",
["Severe Thunderstorms"] = "Сильный дождь",
["Scattered Thunderstorms"] = "Местами грозы",
["Sleet"] = "Гололед",
["Smoke"] = "Туман",
["Snow"] = "Снег",
["Snow Flurries"] = "Снегопад",
["Snow Showers"] = "Снег",
["Snow Showers Early"] = "Утром снегопад",
["Snow Showers Late"] = "Позднее снег",
["Sunny"] = "Солнечно",
["Thunderstorms"] = "Гроза",
["Tornado"] = "Торнадо",
["Tropical Storm"] = "Тропический шторм",
["Windy"] = "Ветер",
-- дни недели
["Monday"] = "Понедельник",
["Tuesday"] = "Вторник",
["Wednesday"] = "Среда",
["Thursday"] = "Четверг",
["Friday"] = "Пятница",
["Saturday"] = "Суббота",
["Sunday"] = "Воскресенье",
-- месяцы
["January"] = "Января",
["February"] = "Февраля",
["March"] = "Марта",
["April"] = "Апреля",
["May"] = "Мая",
["June"] = "Июня",
["July"] = "Июля",
["August"] = "Августа",
["September"] = "Сентября",
["Oktober"] = "Октября",
["November"] = "Ноября",
["December"] = "Декабря",
-- направление ветра
["N"] = "северный",
["NNE"] = "северо-северо-восточный",
["NE"] = "северо-восточный",
["ENE"] = "восточно-северо-восточный",
["E"] = "восточный",
["ESE"] = "восточно-юго-восточный",
["SE"] = "юго-восточный",
["SSE"] = "юго-юго-восточный",
["S"] = "южный",
["SSW"] = "юго-юго-западный",
["SW"] = "юго-западный",
["WSW"] = "западный-юго-западный",
["W"] = "западный",
["WNW"] = "западный-северо-западный",
["NW"] = "северо-западный",
["NNW"] = "северо-северо-западный",
["NA"] = "переменный",
["Calm"] = "штиль",
["CAL"] = "штиль",
}

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

Таблицу лучше поместить в начале функции.

Для вывода текста перевода необходимо сделать некоторые изменения в функции forecast.lua

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


-- помещаем данные в таблицу в forecast_day
table.insert(forecast_day, t)

добавляем команду перевода

-- помещаем данные в таблицу в forecast_day
table.insert(forecast_day, translate_eng_rus[t])

после перезапуска прогноза в памяти будут записаны данные на русском языке.

О том, как вывести иконки погоды и окончательный вариант скрипта будет выложен в следующей, заключительной части.

1 комментарий: