Вывод погоды с http://weather.noaa.gov/
Для вывода погоды используются данные полученные из аэропортов. Список аэропортов, с которых можно вывести прогноз, в приложении.
Шрифт Ubuntu
Иконки погоды из комплекта conkyForecast
Иконки можно использовать любые, главное, чтобы они имели названия типа 1.png
Большой выбор разных иконок на сайте
http://winzoro.com/catalog/icons/wether/, да и поиск в интернете никто не отменял
Краткое описание скриптов:
CONKYRC - самый простой, можно использовать любой.
# Default Fonts
use_xft yes
xftfont Ubuntu:size=8
override_utf8_locale yes
# Performance Settings
update_interval 0.5
total_run_times 0
double_buffer yes
no_buffers yes
net_avg_samples 2
text_buffer_size 2048
# Window Settings
own_window yes
own_window_transparent yes
own_window_type override
own_window_hints undecorated,below,sticky,skip_taskbar,skip_pager
# Window border
draw_borders no
draw_shades no
# Default Color
default_color ffffff
# Color Title.
color0 DD3A21
# Size and position
minimum_size 315 600
gap_x 1
gap_y 24
alignment top_right
# ----- LUA -----
lua_load ~/olgmen/weather.lua
lua_draw_hook_pre widgets
########## НИЖЕ СЛОВА TEXT, ЕСЛИ НЕТ НИКАКИХ ЗАПИСЕЙ,
########## ОБЯЗАТЕЛЬНО ДОЛЖНА БЫТЬ ХОТЬ ОДНА ПУСТАЯ СТРОКА
TEXT
ГЛАВНОЕ - если ниже слова TEXT в conkyrc нет никаких команд, то должна быть хотя бы одна пустая строка ниже слова TEXT, иначе скрипт работать не будет.
Запускают скрипт погоды в conkyrc две строки
lua_load ~/olgmen/calendar.lua
lua_draw_hook_pre widgets
Первая строка указывает адрес скрипта. Если вы помещаете скрипт в папку с именем отличным от olgmen, то необходимо указать путь к папке где находится скрипт.
Вторая строка - запускает скрипт
Скрипту необходимо дать права на исполнение
СКРИПТ WEATHER.LUA
--[[ СКРИПТ ВЫВОДА ПРОГНОЗА ПОГОДЫ
Прогноз берется с http://weather.noaa.gov (прогноз для аэропортов)
olgmen 10.11.2010
]]
require 'cairo'
-- функция перекодировки цвета, глобальная для всех функций
function rgb_to_r_g_b(colour,fgaha)
return ((colour / 0x10000) % 0x100) / 255., ((colour / 0x100) % 0x100) / 255., (colour % 0x100) / 255., fgaha
end
-- ------------------------------------------
--[[ WEATHER ]]
function weather (cr, x, y, w, font, bgc, bga, fgc, fga)
-- высота виджета погоды равна ширине виджета
h = w
-- назначаем вид шрифта и цвет
cairo_select_font_face(cr, font, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD)
cairo_set_source_rgba(cr, rgb_to_r_g_b(fgc, fga))
-- вычисляем размер шрифта относительно ширине окна
local dpi = tonumber(conky_parse('${exec xdpyinfo | grep resolution | cut -c 18-19}'))
local font_pixel_size = w / 8
local font_size = font_pixel_size * 72 / dpi
-- Забираем данные с http://weather.noaa.gov/, переводим на русский, переводим вывод давления в миллиметры ртутного столба, добавляем иконки.
-- температура
text = conky_parse('${weather http://weather.noaa.gov/pub/data/observations/metar/stations/ ULLI temperature}°C')
-- устанавливаем размер шрифта
cairo_set_font_size(cr, font_size * 2.25)
-- выводим текст
cairo_move_to(cr, x + 4.3 * w / 8, y + 2.3 * w / 8)
cairo_text_path(cr, text)
cairo_fill(cr)
-- давление
cairo_set_font_size(cr, font_size * 0.9)
text = "Давление:"
cairo_move_to(cr, x + 1 * w / 8, y + 4.5 * w / 8)
cairo_text_path(cr, text)
cairo_fill(cr)
text = conky_parse('${weather http://weather.noaa.gov/pub/data/observations/metar/stations/ ULLI pressure}')/1.33322
text = math.ceil(text)
cairo_move_to(cr, x + 5.5 * w / 8, y + 4.5 * w / 8)
cairo_text_path(cr, text)
cairo_fill(cr)
-- влажность
text = "Влажность:"
cairo_move_to(cr, x + 1 * w / 8, y + 5.5 * w / 8)
cairo_text_path(cr, text)
cairo_fill(cr)
text = conky_parse('${weather http://weather.noaa.gov/pub/data/observations/metar/stations/ ULLI humidity} %')
cairo_move_to(cr, x + 5.5 * w / 8, y + 5.5 * w / 8)
cairo_text_path(cr, text)
cairo_fill(cr)
--направление ветра
text = "Ветер :"
cairo_move_to(cr, x + 1 * w / 8, y + 6.5 * w / 8)
cairo_text_path(cr, text)
cairo_fill(cr)
text = conky_parse('${weather http://weather.noaa.gov/pub/data/observations/metar/stations/ ULLI wind_dir}')
cairo_move_to(cr, x + 3.5 * w / 8, y + 6.5 * w / 8)
cairo_text_path(cr, text)
cairo_fill(cr)
-- скорость ветра
text = conky_parse('${weather http://weather.noaa.gov/pub/data/observations/metar/stations/ ULLI wind_speed} m/s')
cairo_move_to(cr, x + 5.5 * w / 8, y + 6.5 * w / 8)
cairo_text_path(cr, text)
cairo_fill(cr)
-- обновление
cairo_set_font_size(cr, font_size* 0.4)
text = conky_parse('Последнее обновление: ${weather http://weather.noaa.gov/pub/data/observations/metar/stations/ ULLI last_update} UTC')
cairo_move_to(cr, x + 1.5 * w / 8, y + 7.2 * w / 8)
cairo_text_path(cr, text)
cairo_fill(cr)
-- перевод и вывод иконок
cairo_set_font_size(cr, font_size* 0.8)
-- погода
text = conky_parse('${weather http://weather.noaa.gov/pub/data/observations/metar/stations/ ULLI cloud_cover}')
if text == "" then image = 25 end
if text == "cloudy" then text = "Облачно" image = 26 end
if text == "overcast" then text = "Облачно" image = 26 end
if text == "partly cloudy" then text = "Облачно" image = 29 end -- ночь
if text == "partly cloudy" then text = "Облачно" image = 30 end -- день
if text == "clear" then text = "Ясно" image = 31 end -- ночь
if text == "sunny" then text = "Ясно" image = 32 end -- день
cairo_move_to(cr, x + 1 * w / 8, y + 3.5 * w / 8)
cairo_text_path(cr, text)
cairo_fill(cr)
-- осадки
text = conky_parse('${weather http://weather.noaa.gov/pub/data/observations/metar/stations/ ULLI weather}')
if text == "drizzle" then text = "Морось" image = 9 end
if text == "freezing rain" then text = "Дождь" image = 10 end
if text == "showers" then text = "Снегопад" image = 11 end
if text == "snow" then text = "Снег" image = 16 end
if text == "rain" then text = "Дождь" image = 11 end
if text == "fog" then text = "Туман" image = 20 end
if text == "mist" then text = "Дымка" image = 21 end
cairo_move_to(cr, x + 4 * w / 8, y + 3.5 * w / 8)
cairo_text_path(cr, text)
cairo_fill(cr)
-- иконки
-- создаём имидж изображения
image_bg = cairo_image_surface_create_from_png ("/home/boris/olgmen/weathericons/" .. image .. ".png")
-- забираем данные о ширине и высоте изображения из образа
w1 = cairo_image_surface_get_width (image_bg)
h1 = cairo_image_surface_get_height (image_bg)
-- т.к. начальная точка, левый верхний угол, вывода изображения находится в левом верхнем углу окна конки, переносим изображение
cairo_translate (cr, x + w/8, y + w/8)
-- масштабтруем изображение
cairo_scale (cr, (w/4)/w1, (w/4)/h1)
-- выводим изображение
cairo_set_source_surface (cr, image_bg, 0, 0)
cairo_paint (cr)
cairo_surface_destroy (image_bg)
end
-------------------------------------------------------------------------------------
function conky_widgets()
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)
-- -------------------------------------------------------------------------------------
-- вывод погоды
cr = cairo_create (cs)
weather (cr, 15, 20, 250, "Ubuntu", 0x151515, 1, 0xffffff, 1)
cairo_destroy(cr)
end
Так как скрипт писался под определенные конки, то прогноз выводится как бы в квадрат, высота и ширина выводимой информации равна.
В скрипте использовано масштабирование шрифта и иконки. В зависимости от выбранного размера ширины w пропорционально изменяются размер шрифта и иконки погоды.
Основной размер шрифта вычисляется автоматически в зависимости от разрешения экрана, я считаю, что так удобней, не надо подбирать размеры шрифта.
В данный момент скрипт принимает погоду для Санкт-Петербурга (код ULLI), для приема погоды в другом городе необходимо заменить код Санкт-Петербурга на код своего города. Для этого открываем скрипт в любимом редакторе gedit и заменяем автоматом код ULLI на код своего города, но можно это сделать врукопашную заменив коды в строках
text = conky_parse('${weather http://weather.noaa.gov/pub/data/observations/metar/stations/ ULLI temperature}°C')
text = conky_parse('${weather http://weather.noaa.gov/pub/data/observations/metar/stations/ ULLI pressure}')/1.33322
text = conky_parse('${weather http://weather.noaa.gov/pub/data/observations/metar/stations/ ULLI humidity} %')
text = conky_parse('${weather http://weather.noaa.gov/pub/data/observations/metar/stations/ ULLI wind_dir}')
text = conky_parse('${weather http://weather.noaa.gov/pub/data/observations/metar/stations/ ULLI wind_speed} m/s')
text = conky_parse('Последнее обновление: ${weather http://weather.noaa.gov/pub/data/observations/metar/stations/ ULLI last_update} UTC')
text = conky_parse('${weather http://weather.noaa.gov/pub/data/observations/metar/stations/ ULLI cloud_cover}')
text = conky_parse('${weather http://weather.noaa.gov/pub/data/observations/metar/stations/ ULLI weather}')
Кстати об указанных строках.
Первая выводит температуру
Вторая - давление в мм. ртутного столба, если есть желание принимать в миллибарах то приведите строку к такому виду
text = conky_parse('${weather http://weather.noaa.gov/pub/data/observations/metar/stations/ ULLI pressure}')
Третья - влажность
Четвертая - направление ветра
Пятая - скорость ветра в м/с
Шестая - время последнего обновления.
Седьмая - состояние погоды, облачно, ясно и т.д.
Восьмая - осадки
В данный момент вывод прогноза не полностью русифицирован, просто я не знаю, какие данные к чему относятся, например тайфун и т.п. Тем более, что в Питере сейчас кроме дождя ничего нет, и проверить нет возможности. Но вы можете сами русифицировать текст по такой схеме.
Не русифицированный прогноз выводится на английском языке, и кроме того иконка не выводится, в этом случае, заходите в список состояния погоды (находится в приложении) и добавляете в скрипт, часть скрипта русификации
text = conky_parse('${weather http://weather.noaa.gov/pub/data/observations/metar/stations/ ULLI cloud_cover}')
if text == "" then image = 25 end
if text == "cloudy" then text = "Облачно" image = 26 end
if text == "overcast" then text = "Облачно" image = 26 end
if text == "partly cloudy" then text = "Облачно" image = 29 end -- ночь
if text == "partly cloudy" then text = "Облачно" image = 30 end -- день
if text == "clear" then text = "Ясно" image = 31 end -- ночь
if text == "sunny" then text = "Ясно" image = 32 end -- день
cairo_move_to(cr, x + 1 * w / 8, y + 3.5 * w / 8)
cairo_text_path(cr, text)
cairo_fill(cr)
-- осадки
text = conky_parse('${weather http://weather.noaa.gov/pub/data/observations/metar/stations/ ULLI weather}')
if text == "drizzle" then text = "Морось" image = 9 end
if text == "freezing rain" then text = "Дождь" image = 10 end
if text == "showers" then text = "Снегопад" image = 11 end
if text == "snow" then text = "Снег" image = 16 end
if text == "rain" then text = "Дождь" image = 11 end
if text == "fog" then text = "Туман" image = 20 end
if text == "mist" then text = "Дымка" image = 21 end
строку в таком формате
if text == "cloudy" then text = "Облачно" image = 26 end
Здесь:
"cloudy" - то что выведено в прогнозе
"Облачно" - перевод
26 - номер выводимой иконки
Если прогноз выведен на английском в левой части, то строку вносите в верхний список, а если справа то в нижний.
Под температурой вывод производится только при осадках, в остальное время - пусто
И под конец, строка с параметрами вывода
weather (cr, 15, 20, 250, "Ubuntu", 0x151515, 1, 0xffffff, 1)
Здесь:
15 - расстояние от левой кромки окна конки
20 - расстояние от верхней кромки окна конки
250 - ширина выводимого прогноза
"Ubuntu" - шрифт, можно заменить на свой любимый
0х151515 - цвет фона, в данном скрипте не используется
1 - насыщенность цвета фона, т.е. прозрачность, значения от 0 до 1, 0 - прозрачный, 1 - насыщенность 100%
0хffffff - в данном случае цвет шрифта белый
1 - насыщенность цвета шрифта
Вот кажется и всё. Возникнут вопросы, если знаю - то отвечу.