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.
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
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.
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
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 }
weather=Annecy/France : c'est la météo pour Annecy. Pour vérifier si la ville est connue, il suffit de lancer une recherche sur "Meteo Annecy" (remplacer Annecy bien évidemment par votre coin). Si google affiche en première ligne sa propre météo, c'est qu'il la connait. Sinon ... pas de chance : c'est sûr il y a des manques, mais sa base de données est déjà plus complète que celle l'applet météo utilisée dans Gnome qui ne connait même pas Annecy ...
oe=utf8 : on demande un formatage UTF-8. Important sinon, soit expat se plante, soit n'importe quoi est affiché dans conky.
hl=fr : on veut que ça "cause la France".
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
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
Visitez : Nos sorties Ski et rando |
Copyright Laurent Faillie
2001-2024
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 au total. |
Vous pouvez
laissez un commentaire
sur cette page.