[LUA] Gestion conso et stock pellets
Publié : 30 nov. 2016, 22:17
Bonjour,
Disposant d'un poêle à pellets, je souhaitais :
- Suivre ma consommation
- Suivre mes dépenses de pellets
- Suivre mon stock
- Etre alerté en cas de stock trop bas
Création des variables utilisateurs

- stockPellet1 (Entier) : stock de pellet en cours de consommation
- stockPellet2 (Entier) : stock de pellet de réserve, servira en cas de modification de tarif
- prixSac1 (Décimal) : prix du sac de pellet du stock en cours de consommation
- prixSac2 (Décimal) : prix du sac de pellet du stock de réserve
Si je dois racheter des sacs en cours de saison et si les prix ont varié, cela me permet de suivre précisément mes dépenses.
Création des Virtual device
- ConsoPellet : Counter
- DepensePellet : Counter
- AjoutSac : Switch, Mettre le délai d'extinction à au moins une seconde pour que l'interrupteur repasse automatiquement à Off
- Alerte


Création des scripts LUA
script_device_pellet.lua
script_variable_stock_pellet.lua
Création de l'alerte
Alerte sous forme de blocky
IDX=12 correspond à mon device Alerte
Conclusion
Ce script est largement améliorable.
On peut par exemple ajouter une variable "debug = true/false" pour afficher ou non les messages dans la log.
Le code en lui même est certainement optimisable.
Il répond à mon besoin mais probablement pas au votre.
Mon interrupteur est actionnable depuis l'interface Domoticz (forcément...
), de la custom page (merci Vil1Driver
) et de mon Amazon Dash Bouton quand je ne veux pas allumer la tablette.
N'hésitez pas à me faire vos retours (c'est mon premier tuto, soyez indulgent)
.
Disposant d'un poêle à pellets, je souhaitais :
- Suivre ma consommation
- Suivre mes dépenses de pellets
- Suivre mon stock
- Etre alerté en cas de stock trop bas
Création des variables utilisateurs

- stockPellet1 (Entier) : stock de pellet en cours de consommation
- stockPellet2 (Entier) : stock de pellet de réserve, servira en cas de modification de tarif
- prixSac1 (Décimal) : prix du sac de pellet du stock en cours de consommation
- prixSac2 (Décimal) : prix du sac de pellet du stock de réserve
Si je dois racheter des sacs en cours de saison et si les prix ont varié, cela me permet de suivre précisément mes dépenses.
Création des Virtual device
- ConsoPellet : Counter
- DepensePellet : Counter
- AjoutSac : Switch, Mettre le délai d'extinction à au moins une seconde pour que l'interrupteur repasse automatiquement à Off
- Alerte


Création des scripts LUA
script_device_pellet.lua
Code : Tout sélectionner
-- Version : 20161006_01
-- Author : Snorky
-- Update conso, stock et depense pellet
--------------------------------
-- Variable a editer -----------
--------------------------------
local ajoutSacName = 'AjoutSac' -- Nom virtual device switch pour ajouter un sac
local consoIdx = 27 -- IDX virtual device de consommation de pellets
local consoName = 'ConsoPellet' -- Nom virtual device de consommation de pellets
local stock1Name = 'stockPellet1' -- Nom user variable du stock de pellets en cours de consommation
local depenseIdx = 28 -- IDX virtual device de depense de pellets
local depenseName = 'DepensePellet' -- Nom virtual device de depense de pellets
local prix1Name = 'prixSac1' -- Nom user variable du prix du stock en cours de consommation
--------------------------------
-- Fin des variables a editer --
--------------------------------
--------------------------------
-- Fonctions --
--------------------------------
-- TimeDifference
function timedifference(d)
s = otherdevices_lastupdate[d]
year = string.sub(s, 1, 4)
month = string.sub(s, 6, 7)
day = string.sub(s, 9, 10)
hour = string.sub(s, 12, 13)
minutes = string.sub(s, 15, 16)
seconds = string.sub(s, 18, 19)
t1 = os.time()
t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
difference = os.difftime (t1, t2)
return difference
end
commandArray = {}
if (devicechanged[ajoutSacName] and otherdevices[ajoutSacName] == 'On') then -- Si interrupteur AjoutSac = On
timedifference(consoName)
if (difference > 600) then -- On attend 10 minutes avant ajout nouveau sac
-- Update conso --
consoNew = tonumber(otherdevices_svalues[consoName]) + 1
commandArray[1] = {['UpdateDevice'] = consoIdx.. '|0|' .. tostring(consoNew)}
print('Consommation totale : '..consoNew)
-- Update depense --
depenseNew = tonumber(otherdevices_svalues[depenseName]) + tonumber(uservariables[prix1Name])
commandArray[2] = {['UpdateDevice'] = depenseIdx .. '|0|' .. tostring(depenseNew)}
print('Depense pellet : '..depenseNew..' euros')
-- Update stock --
stockNew = tonumber(uservariables[stock1Name]) - 1
commandArray[3] = {['Variable:'..stock1Name] = tostring(stockNew)}
print('Nouveau stock de pellet : '..stockNew)
else
differencemin = math.floor(difference / 60)
print('Dernier update de la consommation de pellet il y a moins de 10 minutes ('..differencemin..' min).')
end
end
return commandArray Code : Tout sélectionner
-- Version : 20161006_01
-- Author : Snorky
-- Gestion du stock de pellet
--------------------------------
-- Variable a editer -----------
--------------------------------
local stock1Name = 'stockPellet1' -- Nom user variable du stock de pellets en cours de consommation
local stock2Name = 'stockPellet2' -- Nom user variable du stock de pellets de reserve
local prix1Name = 'prixSac1' -- Nom user variable du prix du stock en cours de consommation
local prix2Name = 'prixSac2' -- Nom user variable du prix du stock de reserve
--------------------------------
-- Fin des variables a editer --
--------------------------------
commandArray = {}
if (uservariablechanged[stock1Name]) then
-- Gestion du stock --
if (tonumber(uservariables[stock1Name])==0) then
stockReserve = tostring(uservariables[stock2Name])
commandArray[1] = {['Variable:'..stock1Name] = stockReserve}
commandArray[2] = {['Variable:'..stock2Name] = '0'}
commandArray[3] = {['Variable:'..prix1Name] = tostring(uservariables[prix2Name]}
print('Nouveau stock de pellet : '..stockReserve..' sacs')
end
end
return commandArray Alerte sous forme de blocky
Code : Tout sélectionner
<IP:Port>/json.htm?type=command¶m=udevice&idx=12&nvalue=4&svalue=AlertePellet
<IP:Port>/json.htm?type=command¶m=udevice&idx=12&nvalue=2&svalue=AlertePellet
<IP:Port>/json.htm?type=command¶m=udevice&idx=12&nvalue=1&svalue=AlertePellet
<IP:Port>/json.htm?type=command¶m=udevice&idx=12&nvalue=0&svalue=AlertePelletConclusion
Ce script est largement améliorable.
On peut par exemple ajouter une variable "debug = true/false" pour afficher ou non les messages dans la log.
Le code en lui même est certainement optimisable.
Il répond à mon besoin mais probablement pas au votre.
Mon interrupteur est actionnable depuis l'interface Domoticz (forcément...
N'hésitez pas à me faire vos retours (c'est mon premier tuto, soyez indulgent)