вторник, 22 ноября 2011 г.

Погода с сайта http://www.wunderground.com/ в conky

В связи с тем, что с помощью conkyForecast получать прогноз погоды бесплатно теперь невозможно, попытаюсь объяснить как я беру прогноз погоды с сайта http://www.wunderground.com/. Сначала как это выглядит

Рисунок    ночь
Рисунок день





Выводится текущий прогноз с переключением картинки на дневную и ночную. Сначала я хотел брать иконки погоды из сети, но оказалось, что это занимает много времени при запуске коньков. Поэтому все картинки скачены с интернета и помещены в папку weathericons. Можно взять любые иконки, но тогда необходимо их переименовать.

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

Conkyrc можно взять любой, главное чтобы conky, установленные на компьютере, были с поддержкой lua. Короче говоря должны быть установлены conky-all, которые имеют поддержку языка lua.

Так как эти conky выводят только погоду, то ниже слова TEXT в conkyrc имеется только одна строка.

${execi 600 sh ~/conky_20.03.2011/scripts/pogoda.sh}

Команда execi через заданный интервал времени в секундах запускает скрипт pogoda.sh, путь до которой необходимо указать. Другими словами в этой строке каждые 10 минут запускается скрипт pogoda.sh находящийся в папке scripts, которая находится в папке conky_20.03.2011, которая в свою очередь находится в домашней директории.

Скрипт pogoda.sh забирает данные с сайта http://www.wunderground.com/. Первая строка

#!/bin/bash

говорит о том, что скрипт написан на bash

Вторая строка

urlInfosWeather="http://rss.wunderground.com/auto/rss_full/global/stations/26063.xml?units=metric"

содержит ссылку на адрес города на сайте http://www.wunderground.com/

 Для вывода прогноза Вашего города необходимо зайти на сайт http://www.wunderground.com и вписать название своего города. Если город будет найден вы перейдете на страницу с прогнозом погоды. В правом верхнем углу находятся две кнопки ICAL(зелёная) and RSS(красная). Щелкните правой кнопкой мыши по красной кнопке и скопируйте ссылку на адрес.

В строке необходимо заменить данные с адресом, т.к. в приведённом примере дан код Санкт-Петербурга

"http://rss.wunderground.com/auto/rss_full/global/stations/26063.xml?units=metric"

на скопированные вами данные.

Строки

fileTmpWeather="/tmp/weathertemp"
fileWeatherText="/tmp/weathertext"

направляют промежуточные и отфильтрованные данные для хранения в папку /tmp

Строки

if [ -f $fileTmpWeather ]; then
    rm $fileTmpWeather
fi

стирают старые данные при получении новых

Строки

wget -O $fileTmpWeather $urlInfosWeather
sed -i -e 's/&/\n/g' -e 's/>/\n/g' -e 's/\//\n/g' -e 's/</\n/g' $fileTmpWeather
egrep -i 'Temperature:| Humidity:| Pressure:' $fileTmpWeather > $fileWeatherText
sed -i -e 's/!//g' -e 's/\[CDATA\[//g' -e 's/deg\;C//g' -e 's/ | //g' $fileWeatherText
sed -i -e 's/Temperature: //g' -e 's/Humidity: //g' -e 's/%/\n/g' $fileWeatherText
sed -i -e 's/Pressure: //g' -e 's/hPa /\n/g' -e 's/(//g' $fileWeatherText
sed -i -e 's/)Conditions: /\n/g' -e 's/Wind Direction: /\n/g' $fileWeatherText
sed -i -e 's/Wind Speed: /\n/g' -e 's/km//g' $fileWeatherText

отфильтровывают данные в файл /tmp/weathertext откуда они забираются для вывода в окно коньков.

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

Для запуска lua-скриптов в conkyrc, выше слова TEXT добавляем строки

lua_load ~/conky_20.03.2011/scripts/main.lua
lua_draw_hook_pre conky_main

Первая строка указывает на место хранения скрипта, а вторая запускает скрипт.


Скрипт main.lua содержит все основные данные необходимые для вывода. Рассмотрим что в нём находится.

Так как в скриптах используются команды языка cairo и также необходимо забирать данные из папки /tmp, первые строки скрипта указывает конькам, что это необходимо учитывать

require 'cairo'
require 'imlib2'

Строка

usrhome = os.getenv("HOME")

позволяет запускать данные коньки на любом компьютере, т.е. нет необходимости редактировать скрипты изменяя название домашней директории, всё будет происходить автоматически.

Строка

color = 0xffffff

задает значение цвета, в данном скрипте цвет шрифта, сразу для всех выводимых значений

Согласно программе conky возможен запуск только двух lua-скриптов, для запуска более двух lua-скриптов можно использовать такой способ

dofile (usrhome .. "/conky_20.03.2011/scripts/function_draw_image.lua")
dofile (usrhome .. "/conky_20.03.2011/scripts/simple_text.lua")

Эти строки сообщают программе, что необходимо использовать ещё два lua-скрипта расположенных по соответствующим адресам.

Далее расположена сама функция которая задает размеры, шрифт, цвет всем выводимым текстам и запускает скрипты вывода текстов и изображений

Объясню, что означают следующие строки на примере первого блока данных

{
text = conky_parse("${exec sed -n '1p' /tmp/weathertext}°C"),
x = 85,
y = 45,
font_size = 24,
bold = true,
h_align = "c",
colour = color,
},

Первая строка задает значение переменной text. Это значение забирается из первой строки файла /tmp/weathertext
Далее следуют:
- координаты, куда будет выведен этот текст
- размер шрифта
- "жирный" шрифт
- координаты соответствуют середине текста (центровка текста)
- цвет шрифта

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

Третий блок выводит направление ветра

Четвёртый - скорость ветра, переведённая в м/сек

Пятая - влажность в процентах

Далее следует обязательный блок необходимый для работы срипта

Проверяем, существует ли окно conky

    if conky_window==nil then return end

Забираем данные об окне conky

    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)
    draw_image_rect(cr, 7, 10, 120, "weather")
    cairo_destroy(cr)

Здесь первая строка

cr = cairo_create (cs)

"говорит" программе, что необходимо в окне conky

Вторая строка

draw_image_rect(cr, 7, 10, 120, "weather")

дает команду запустить функцию с названием draw_image_rect которая выведет в окно conky в позицию с координатами x=7, y=10, размером 100 пикселей картинку с названием weather

Третья строка закрывает окно conky

Скрипт вывода текста немного сложнее

    for i,v in pairs(weather_settings) do

        cr = cairo_create (cs)
        display_text(v)
        cairo_destroy(cr)
    end

Строка

for i,v in pairs(weather_settings) do

даёт команду считать из weather_settings один блок данных.

в окно conky cr = cairo_create (cs)


Запускается функция display_text(v) с полученными данными

Закрывается окно cairo_destroy(cr)


Если есть ещё блоки с данными в weather_settings то берется очередной блок с данными, иначе переход к следующим строкам скрипта end

Строка

cairo_surface_destroy(cs)

Закрывает окно конки для ввода изображений.

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

Комментариев нет:

Отправить комментарий