D'un côté, nous avons conky qui affichent des données sur notre bureau. De l'autre, le protocole MQTT permet d'exposer autant de données que l'on veut à autant de clients que nécessaires ... Alors, pourquoi ne pas marier les 2 ? C'est l'objet de cet article.
On commence par charger la librairie Paho
local MQTT = require "paho.mqtt"
et on définit où se trouve le broker.
local broker_host = "bpi.chez.moi" -- Where to find the broker
local broker_port = 1883 -- at which port
Suit la déclaration des topics auxquels ont souhaite s'abonner, au format suivant :
clef = { tpc = nom_du_topic [, max = valeur_maximum] }
avec
Ce qui donne chez moi
local topics = { -- Topics to subscribe
Consomation = {tpc = '/TeleInfo/Consommation/values/PAPP', max=13200}, -- 220v * 60a
Production = {tpc = '/TeleInfo/Production/values/PAPP', max=1900},
Bureau = {tpc = '/maison/Temperature/Bureau'},
Cave = {tpc = '/maison/Temperature/Cave'},
Dehors = {tpc = '/maison/Temperature/Dehors'}
}
J'ai un abonnement 60A donc la puissance maxi est 220v * 60A (en fait, la tension est généralement plus haute, mais bon, comme on ne devrait jamais atteindre les 100% ...). Quant à la production, j'ai un onduleur de 1900w
2 tableaux sont créés :
ttopics = {}
rtopics = {}
for k,v in pairs( topics ) do
ttopics[ #ttopics + 1 ] = v.tpc
rtopics[ v.tpc ] = k
end
La fonction callback() sera appelée à chaque message reçu : une variable globale est créée avec le contenu du topic.
function callback( topic, message)
-- uncomment next line to get some debug messages
-- print("Topic: " .. topic .. ", message: '" .. message .. "'")
_G[ rtopics[ topic ] ] = message
end
suit la fonction init() qui
function conky_init()
brkc = MQTT.client.create( broker_host, broker_port, callback)
brkc:connect( conky_parse( '$nodename' ) ..'_' .. os.getenv('USER') )
brkc:subscribe( ttopics )
end
La fonction handlebroker() est appelée avant chaque rafraîchissement des données de Conky ... ce qui fait que ce délai doit être inférieur au timeout du broker. Elle ne fait qu'appeler la méthode brkc:handler() qui appelle callback() si des messages sont arrivés.
function conky_handlebroker() -- loop to handle messages
if not brkc then -- As it seems lua_draw_hook_pre is called before init :(
return
end
local err = brkc:handler()
if err then
print('*E*',err);
end
end
displayvar() affiche le contenu d'une variable et de l'unité correspondante ... après avoir vérifié qu'elle est définie.
function conky_displayvar( var, unite )
if not _G[ var ] then
return '????'
else
return tostring(_G[ var ]).."${color grey}"..unite
end
end
getprc() quant à elle calcule le pourcentage d'utilisation
function conky_getprc( var )
return 100*_G[ var ]/topics[ var ].max
end
Voici les directives a ajouter dans le fichier de configuration de conky.
On commence par charger notre script Lua
lua_load /usr/local/share/Conky/subscribeMQTT.lua
ensuite, on définit respectivement une fonction qui sera appelée à chaque re-chargement du fichier de config, une seconde pour faire le ménage avant de recharger le dit fichier ou lorsque conky s'arrête, enfin, une fonction a appeler avant chaque rafraîchissement de la fenêtre de conky.
lua_startup_hook init
lua_shutdown_hook cleanup
lua_draw_hook_pre handlebroker
Pour faciliter le code de l'affichage des températures, j'ai créé un template
template0 ${color grey} : ${color}${lua_parse displayvar }
L'affichage des températures se fait brute de fonderie avec le template défini précédemment
${color Green}Températures maison${offset 8}${color8}${voffset -2}${hr}
${template0 Dehors Dehors °C} ${template0 Cave Cave °C}
${template0 Bureau Bureau °C}
Quant aux informations des compteurs EDF, elles sont affichées sous forme de barres
${template0 Consomation Consomation VA} ${lua_bar getprc Consomation}
${template0 Production Production VA} ${lua_bar getprc Production}
Voici ce que ça donne
et les fichiers correspondants
Note : avec la version actuelle, app-admin/conky-1.9.0, il n'est pas possible d'avoir plusieurs hooks.
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.