«

»

Oct 20

Vera, Lua et quelques fonctions indispensables

La vera (veralite dans mon cas) est une box domotique qui a l’avantage de ne pas être dépendante d’internet et d’offrir la possibilité de créer des scènes directement en LUA, ce qui permet de faire à peu près n’importe quoi. En revanche, elle a le défaut de ne pas être très user friendly et les mises à jour sont longues à venir et pas toujours très stables (elle ne gère toujours pas les chiffres à virgule dans les triggers de déclenchement des scènes par exemple….)

Les défauts ne me gênant pas plus que ça (enfin, sauf la stabilité à laquelle j’ai été confronté dernièrement, mais j’y reviendrais dans un autre article….) et vu les qualités qu’elle a, c’est pour ça que je l’ai choisis (bon, un autre langage que le LUA aurait été mieux, mais ceci est un autre débat dans lequel je ne rentrerais pas ^^). Par contre, il manque quelques petites choses pour rendre la programmation plus simple et offrir plus d’options.
C’est là que l’on commence à pourrir le LUA de démarrage. Dedans, vous allez pouvoir y mettre tout un tas de constantes et de fonctions qui seront accessibles à tous vos scripts.
C’est là que j’en viens à ce billet pour vous donner quelques bonnes pratiques que j’ai mis en place, ainsi que 2 ou 3 fonctions qui me sont indispensables.

Déclaration de variables pour les identifiants des modules

Très utile lorsque vous utilisez un module dans plusieurs scènes/triggers. Si jamais vous changez le module par un autre (ou que vous changez les piles d’une sonde de température qui fonctionne avec le rfxtrx, ce qui revient à remplacer le module par un autre), inutile d’aller modifier toutes vos scènes pour renseigner le nouvel id. Une petite édition du LUA de démarage et c’est bon.

id_module_tempe_chambre = 35
id_module_tempe_rdc = 101
id_radiateur_salon = 26
id_radiateur_salle = 27

Un peu de conf

Quelques informations en conf pour faire du délestage sur mes radiateurs. J’ai besoin de connaitre leurs consommations avant de les allumer. Idem pour 2 ou 3 autres appareils, histoire de calculer la conso globale (surtout utile la nuit puisque c’est là que j’utilise sèche-linge et cumulus qui sont très énergivores).

dataRadiateur = {
	[id_radiateur_salon] = {
		["puissance"] = 1000
		,["etatOn"] = 0
		,["etatOff"] = 1
		,["deleste"] = 0
	}
	,[id_radiateur_salle] = {
		["puissance"] = 2000
		,["etatOn"] = 0
		,["etatOff"] = 1
		,["deleste"] = 0
	}
	,[id_radiateur_palier] = {
		["puissance"] = 1000
		,["etatOn"] = 1
		,["etatOff"] = 0
		,["deleste"] = 1
	}
}

On voit ici un tableau de configuration qui me permet donc de connaitre la puissance de mes radiateurs.
Je stocke sa puissance, son état ON ou OFF (pour rappel, j’ai 3 radiateurs qui ne fonctionnent pas en mode ON/OFF mais en mode confort/eco avec le fil pilote. Confort = pas de courant sur le fil pilote (état ON mais module OFF), eco = courant sur le fil pilote (état OFF mais module ON)). Le paramètre « déleste » me permet de savoir si je coupe ce radiateur quelque soit la température en fonction de la consommation de la maison.

Fonction intime

Fonction très pratique pour savoir si l’heure est comprise entre 2 bornes. Je m’en sers pour faire mes coupures de chauffage l’hiver.

function inTime(startTime, endTime) 

    local hour = tonumber(startTime:sub( startTime:find("%d+")))
    local minute = tonumber(startTime:sub(-2))

    if hour and minute then
        startTime = hour * 100 + minute
    else
        luup.log("inTime: ERROR: invalid start time")
        return 0
    end

    hour = tonumber( endTime:sub( endTime:find("%d+") ) )
    minute = tonumber(endTime:sub(-2))

    if hour and minute then
        endTime = hour * 100 + minute
    else
        luup.log("inTime: ERROR: invalid end time")
        return 0
    end

    local currentTime = os.date("*t")
    currentTime = currentTime.hour * 100 + currentTime.min

    local intervalTime = (endTime - startTime) % 2400
    if (((currentTime - startTime) % 2400) < intervalTime) then
        -- I'm in
        return 1
    end

    -- I'm out
    return 0
end

Je vous passe l’explication de la fonction qui ne vous apportera pas grand chose (et qui reste relativement simple à comprendre à partir du moment où on s’y connait un peu en dev). On l’utilise en faisant inTime(« 22:30 », « 06:30 ») pour savoir si on est bien entre 22h30 et 6h30.
J’ai trouvé cette fonction je ne sais plus où. Il y a peut être moyen de faire plus efficace, je n’y ai pas réfléchi. Moi, elle me suffit comme ça ^^

Fonction sleep

Idem, une fonction qui peut être très pratique pour ralentir l’exécution d’un script, histoire que certains modules aient le temps de basculer avant de continuer le script. Je m’en sers pour mes radiateurs, afin de ne pas les switcher tous d’un coup, histoire d’éviter d’avoir tous les pics de puissance d’allumage des radiateurs en même temps.

clock = os.clock
function sleep(n)  -- seconds
  local t0 = clock()
  while clock() - t0 <= n do end
end

Voilà pour ces quelques bonnes pratiques et fonctions très utiles ^^
Si jamais je m’aperçois que j’utilise de plus en plus de fonctions comme ça, je referais des billets dans ce style, voire même pourquoi pas, créer une page pour les lister ^^

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser les balises HTML suivantes : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>