пятница, 28 мая 2010 г.

Погода в Conky

Обычно настройка погоды в Conky делается через ConkyForecast, но у меня был полный провал на этом пути. Я совершенно случайно нашел другой вариант. Погоду можно получать в виде xml-документа. Затем обрабатывать в командной строке, т.е. в bash, и выводить на десктоп. На сайте TreadStates я нашел ссылку на архив с bash-сценарием и xslt-документом, с помощью которого xml-информация превращается в читаемый человеком вид. Но погода с xoap.weather.com мне не подходит. Xml-документ можно получать с других сайтов. А именно с GISMETEO.RU. Сайт погодовещателя выводит информеры как сервис и примочку для вебмастеров и сайтовладельцев. Там представлены как простые баннеры с цифрами и картинками или флеш баннеры, так и ссылка на xml-документ с погодой для продвынутых вебмастеров (Не считаю себя продвинутым).
В сценарии были прописаны команды и файлы которые следует использовать для получения погоды. Я немного модифицировал его. Выглядит он следующим образом:
#!/bin/sh
RUNDIR=/home/borilav/bin/
CURLCMD=/usr/bin/curl
XSLTCMD=/usr/bin/xsltproc
CURLURL="http://informer.gismeteo.ru/xml/27612_1.xml"
XSLT=/home/borislav/bin/gis1.xsl
#####
eval "$CURLCMD \"$CURLURL\" 2>/dev/null | $XSLTCMD $XSLT"


В качестве шаблона для xml с гисметео используется gis.xsl. Признаюсь над ним пришлось потрудиться. В статье я нашел способ обработки (это оказывается называется "парсинг") xml от гисметео. Там описали способ представления для html-документа. Я адаптировал его для текстового формата. Выглядит вот так.

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns=">http://www.w3.org/1999/xhtml">
<xsl:output method="text" indent="yes" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>
<!--Шаблон, преобразующий порядковый номер месяца в его текстовое представление-->
<xsl:template name="hour-abbreviation">
<xsl:param name="hour"/>
<xsl:choose>
<xsl:when test="$hour = 03">ночь</xsl:when>
<xsl:when test="$hour = 09">утро</xsl:when>
<xsl:when test="$hour = 15">день</xsl:when>
<xsl:when test="$hour = 21">вечер</xsl:when>
<xsl:otherwise>?</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!--Шаблон, показывающий текстовое представление облачности-->
<xsl:template name="get-cloudiness">
<xsl:param name="cloudiness"/>
<xsl:choose>
<xsl:when test="$cloudiness = 0">ясно</xsl:when>
<xsl:when test="$cloudiness = 1">малооблачно</xsl:when>
<xsl:when test="$cloudiness = 2">облачно</xsl:when>
<xsl:when test="$cloudiness = 3">пасмурно</xsl:when>
<xsl:otherwise>?</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!--Шаблон, показывающий текстовое представление атмосферных явлений-->
<xsl:template name="get-precipitation">
<xsl:param name="precipitation"/>
<xsl:choose>
<xsl:when test="$precipitation = 4">дождь</xsl:when>
<xsl:when test="$precipitation = 5">ливень</xsl:when>
<xsl:when test="$precipitation = 6">снег</xsl:when>
<xsl:when test="$precipitation = 7">снег</xsl:when>
<xsl:when test="$precipitation = 8">гроза</xsl:when>
<xsl:when test="$precipitation = 10">без осадков</xsl:when>
<xsl:otherwise>?</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!--Шаблон, отображающий атмосферные явления-->
<xsl:template match="PHENOMENA">
<xsl:call-template name="get-cloudiness"> <xsl:with-param name="cloudiness" select="@cloudiness" /></xsl:call-template>, <xsl:call-template name="get-precipitation"><xsl:with-param name="precipitation" select="@precipitation" /> </xsl:call-template>
</xsl:template>
<!--Шаблон, отображающий температуру-->
<xsl:template match="TEMPERATURE">
<xsl:value-of select="@min"/>..<xsl:value-of select="@max"/> °C
</xsl:template>
<xsl:template match="RELWET">
<xsl:value-of select="@min"/>..<xsl:value-of select="@max"/> %
</xsl:template>
<xsl:template match="PRESSURE">
<xsl:value-of select="@min"/>..<xsl:value-of select="@max"/> мм рт.ст.
</xsl:template>
<!--Корневой шаблн результирующей страницы-->
<xsl:template match="/">
<!--Здесь мы выбираем только самый первый(ближайший) прогноз под номером 1 -->
<xsl:apply-templates select="MMWEATHER/*/TOWN/FORECAST[1]"/>
<xsl:apply-templates select="MMWEATHER/*/TOWN/FORECAST[2]"/>
<xsl:apply-templates select="MMWEATHER/*/TOWN/FORECAST[3]"/>
<xsl:apply-templates select="MMWEATHER/*/TOWN/FORECAST[4]"/>
</xsl:template>
<!--Базовый шаблон, отображающий информер-->
<xsl:template match="MMWEATHER/*/TOWN/FORECAST">
<xsl:apply-templates select="TEMPERATURE"/>
<xsl:apply-templates select="RELWET"/>
<xsl:apply-templates select="PRESSURE"/>
<xsl:apply-templates select="PHENOMENA"/>
</xsl:template>
</xsl:stylesheet>



Далее в файл настроек Conky вставляется строка.

${execpi 60 /home/borislav/bin/gis.sh}


Но не все гладко и точно работает, потому что я не знаю почему и как нужно исправить во всем этом коде для нормального отбражения.
Получилось сделать, чтобы не было кривизны это разбить эту массу цифр и букофф на четыре файла, каждый обращается в гисметео и получает погоду. Потом обращается к своему шаблону xsl и выводит погоду для своего прописанного времени суток (благо у гисметео погода приведена на 3 часа ночи, 9 - утра, 15 - дня и 21 - вечера). В conky-мониторе кривизна вывода компенсируется приставками и надстройками.

$alignc GISMETEO.RU

${color #7E0000} Ночь${color}
${execpi 60 /home/borislav/bin/gis.sh}

${color #7E0000} Утро${color}
${execpi 60 /home/borislav/bin/gis2.sh}

${color #7E0000} День${color}
${execpi 60 /home/borislav/bin/gis3.sh}

${color #7E0000} Вечер${color}
${execpi 60 /home/borislav/bin/gis4.sh}





Вот такая вот погода.

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