Où sommes nous ?

Retour

S'abonner à des flux MQTT

Références

Mon architecture

Paho Lua, la librairie MQTT pour Lua

TeleInfod : un démon pour publier les données téléinfo

Marcel : un démon pour publier entre autres les données du bus 1-wire

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.

Le script Lua

Configuration

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

un peu de pré-processing

2 tableaux sont créés :

ttopics = {}
rtopics = {}
for k,v in pairs( topics ) do
    ttopics[ #ttopics + 1 ] = v.tpc
    rtopics[ v.tpc ] = k
end

init et réception des données

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

handlebroker(), reception des messages

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

Accès aux données pour Conky

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

La configuration de Conky

Voici les directives a ajouter dans le fichier de configuration de conky.

Dans l'entête

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  }

Dans la section TEXT

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}

Résultat

Voici ce que ça donne

et les fichiers correspondants


MQTTsub.lua

conkyMQTT

Attention

Note : avec la version actuelle, app-admin/conky-1.9.0, il n'est pas possible d'avoir plusieurs hooks.


Visitez :
La liste de nos voyages
Nos sorties Ski et rando
Copyright Laurent Faillie 2001-2017
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.