Où sommes nous ?

Retour

Un Conky Météo depuis Google.

Mise à jour du 1 septembre 2012

Il semblerait que Google ait désactivé ce service

Mon objectif était d'avoir les prévisions météo sur mon écran et ce, de façon la plus légère possible. Légèreté implique pour moi d'éviter de forker des scripts externes lorsque ce n'est pas nécessaire. Ça tombe bien, Conky embarque un langage puissant : LUA.
D'un autre côté, google présente sur le net une API pour avoir les prévisions météo ...

Voici donc ma solution pour faire le lien entre les 2.

Pré-requis pour conky

Il faut avoir un conky qui soit compilé avec les extensions :

Les distributions binaires telles qu'Ubuntu ont généralement ces options dans leurs packages. Pour une explication complète sous Gentoo, voir mon billet, sinon ajouter dans le fichier /etc/portage/package.use la ligne :

app-admin/conky lua-imlib lua-cairo curl

Ensuite, mon script à besoin de la librairie luaexpat pour décoder l'XML. A l'heure où j'écris ces lignes, il s'agit d'un package encore "non stable" donc il faudra rajouter la ligne suivante dans /etc/portage/package.keywords

dev-lua/luaexpat ~x86

suivi d'un

emerge luaexpat

Note importante

En poussant plus loin mes investigations, je me suis aperçu que les pauvres ebuild disponibles sont totalement obsolètes. Même s'ils fonctionneront très bien pour ce script, je conseille cependant de passer à LuaRocks pour avoir les dernières versions.

Les icônes de google

Mon script a aussi besoin des icônes de Google Weather. Comme je doute qu'ils soient publique, je vous laisse le soin de les récupérer : cette page explique où les trouver (au jour où j'écris ces lignes, il semblerait que Google utilise les "old").
Ils seront à placer dans le répertoire /usr/local/share/conky/MeteoGoogle/icons.

$ ls /usr/local/share/conky/MeteoGoogle/icons
chance_of_rain.gif fog.gif partly_cloudy.gif smoke.gif
chance_of_snow.gif icy.gif rain.gif snow.gif
chance_of_storm.gif mist.gif rain_snow.gif storm.gif
cloudy.gif mostly_cloudy.gif showers.gif sunny.gif
flurries.gif mostly_sunny.gif sleet.gif thunderstorm.gif

Les scripts

config_icons

alignment top_left
double_buffer yes
default_color white
background no
update_interval 1.0 # Sera changé dans le script une fois les données récupérées
out_to_console no
out_to_stderr no

own_window yes
own_window_class Conky
own_window_type normal
own_window_hints undecorated,below,sticky,skip_taskbar,skip_pager
own_window_transparent yes

lua_load /usr/local/share/conky/MeteoGoogle/GoogleMeteo.lua

TEXT
${if_empty ${lua GoogleMeteo_Maj ${curl http://www.google.com/ig/api?weather=Annecy/France&oe=utf8&hl=fr 15 }}}
En attente ...
${else}${iconv_start UTF-8 ISO_8859-1}${color Green}${lua GoogleMeteo_city}${offset 8}$color${voffset -2}${hr}

${color grey}Condition à : $color${time %H:%M:%S}
${lua_parse GoogleMeteo_Icon}${offset 42}${color grey}Température : ${color orange}${lua GoogleMeteo_Temperature } °C
${offset 42}${color grey}Humidité : $color${lua GoogleMeteo_humidity}%
${offset 42}${color grey}Vent : $color${lua GoogleMeteo_Wind}

${voffset 3}
${color grey}Prévision pour ${color orange}Aujourd'hui ${offset 8}${color grey}${voffset -2}${hr}

${lua_parse GoogleMeteo_pIcon 1}${offset 42}$color${lua GoogleMeteo_date }
${offset 42}${color grey}Températures : $color${lua GoogleMeteo_pMini 1} ${color grey}/ $color${lua GoogleMeteo_pMaxi 1} ${color grey}°C


${color grey}Prévision pour les jours suivants ${offset 8}${color grey}${voffset -2}${hr}

${lua_parse GoogleMeteo_pIcon 2}${lua_parse GoogleMeteo_pIcon 3}${lua_parse GoogleMeteo_pIcon 4}
${voffset 22} ${color orange}${lua GoogleMeteo_pJour 2}${offset 59}${lua GoogleMeteo_pJour 3}${offset 53}${lua GoogleMeteo_pJour 4}
$color${lua GoogleMeteo_pMinif 2} ${color grey}/ $color${lua GoogleMeteo_pMaxif 2} ${color grey}°C ${offset 10}$color${lua GoogleMeteo_pMinif 3} ${color grey}/ $color${lua GoogleMeteo_pMaxif 3} ${color grey}°C${offset 10}$color${lua GoogleMeteo_pMinif 4} ${color grey}/ $color${lua GoogleMeteo_pMaxif 4} ${color grey}°C
$color$hr${iconv_stop}
${endif}

On portera une attention particulière  à la ligne 18 et son

${curl http://www.google.com/ig/api?weather=Annecy/France&oe=utf8&hl=fr 15 }

GoogleMeteo.lua

require "lxp"

ICONS_DIR='/usr/local/share/conky/MeteoGoogle/icons/' -- Where to find icons

function conky_GoogleMeteo_Maj( cmd )
s = conky_parse( cmd )

if s == "" then -- Pas de reponse
conky_set_update_interval(60) -- On a perdu le contact, on verifie toutes les minutes
return ""
end
conky_set_update_interval(900) -- Pas besoin d'avoir des mise a jour frequentes : 15'

-- Construit la reponse
prevision = {}
local idx=0
local current_conditions = false; local forecast_conditions = false
callbacks = {
StartElement = function (parser, name, attrs)
if name == "city" then
city = attrs.data;
elseif name == "forecast_date" then
forecast_date = attrs.data
elseif name == "condition" then
if current_conditions then
condition = attrs.data
elseif forecast_conditions then
fcondition = attrs.data
end
elseif name == "icon" then
-- 20 = len("/ig/images/weather/")
local icn = string.sub( attrs.data, 20)
if current_conditions then
icon = icn
elseif forecast_conditions then
ficon = icn
end
elseif name == "humidity" then
humidity = string.match(attrs.data, "%d+")
elseif name == "wind_condition" then
wind_condition = string.gsub(attrs.data, "%a+ : ", "" )
elseif name == "temp_c" then
temperature = attrs.data
elseif name == "current_conditions" then
current_conditions = true
elseif name == "forecast_conditions" then
forecast_conditions = true
idx = idx + 1
elseif name == "day_of_week" then
jour = attrs.data
elseif name == "low" then
minimum = attrs.data
elseif name == "high" then
maximum = attrs.data
end
end,
EndElement = function (parser, name)
if name == "current_conditions" then
current_conditions = false
elseif name == "forecast_conditions" then
prevision[idx] = { jour=jour, condition=fcondition, minimum=minimum, maximum=maximum, icon=ficon }
forecast_conditions = false
end
end
}
p = lxp.new(callbacks)
p:parse(s)
p:parse()
p:close()

-- Formate la date de la prévision
local a,m,j = forecast_date:match("(%d+)-(%d+)-(%d+)")
forecast_date = os.time{year=a, month=m, day=j, hour=0}

return "ok"
end

function conky_GoogleMeteo_date()
return os.date("%a %d %b %Y", forecast_date)
end

function conky_GoogleMeteo_city()
return city
end

function conky_GoogleMeteo_condition()
return condition
end

function conky_GoogleMeteo_humidity()
return humidity
end

function conky_GoogleMeteo_Wind()
return wind_condition
end

function conky_GoogleMeteo_Temperature()
return temperature
end

function conky_GoogleMeteo_Icon()
return "${image ".. ICONS_DIR .. icon .." -p 0,28 }"
end

function conky_GoogleMeteo_pJour( idx )
return prevision[tonumber(idx)].jour
end

function conky_GoogleMeteo_pCondition( idx )
return prevision[tonumber(idx)].condition
end

function conky_GoogleMeteo_pMini( idx )
return prevision[tonumber(idx)].minimum
end

function conky_GoogleMeteo_pMinif( idx )
return string.format("%2d", prevision[tonumber(idx)].minimum)
end


function conky_GoogleMeteo_pMaxi( idx )
return prevision[tonumber(idx)].maximum
end

function conky_GoogleMeteo_pMaxif( idx )
return string.format("%2d", prevision[tonumber(idx)].maximum)
end

function conky_GoogleMeteo_pIcon( idx )
idx = tonumber(idx)
if idx == 1 then
return "${image ".. ICONS_DIR .. prevision[1].icon .." -p 0,92 }"
elseif idx == 2 then
return "${image ".. ICONS_DIR .. prevision[2].icon .." -p 9,151 }"
elseif idx == 3 then
return "${image ".. ICONS_DIR .. prevision[3].icon .." -p 85,151 }"
elseif idx == 4 then
return "${image ".. ICONS_DIR .. prevision[4].icon .." -p 161,151 }"
else
return "Mauvais index"
end

end

Avec

Lancement de Conky

Comme j'ai déjà un conky de lancer pour les paramètres système, il faut en lancer un second en spécifiant le fichier de configuration :

conky -c /usr/local/share/conky/MeteoGoogle/config_icons

Pour un démarrage automatique au lancement de ma session, j'ai créé le fichier ~/.config/autostart/conkyMeteo.desktop :

[Desktop Entry]
Type=Application
Name=conky
Exec=conky -c /usr/local/share/conky/MeteoGoogle/config_icons
NoDisplay=true

Résultat

Historique


Visitez :
La liste de nos voyages
Nos sorties Ski et rando
Copyright Laurent Faillie 2001-2019
N'oubliez pas d'entrer le mot de passe pour voir aussi les photos perso.
Contactez moi si vous souhaitez réutiliser ces photos et pour les obtenir avec une plus grande résolution.
Visites durant les 7 derniers jours Nombre de visites au total.

Vous pouvez laissez un commentaire sur cette page.